笔者学识有限。 本博客旨在对mitre_sfr核心代码进行简单注解, 详细内容读者仁者见仁智者见智。

SFR算法对ESF曲线进行差分得到LSF;

给LSF加上汉明窗, 降低干扰;

对加窗后的LSF曲线进行DFT, 得到SFR。

/*****************************************************************************/

/* This has been modified from Annex A, to more closely match Annex D and

reduce finite difference errors. Now allows either [-1 1] derivative

(when separation = 0) or [-1/2 0 1/2] derivative (when separation=1)

Inputs: len length of ESF array

AveEdge array of ESF values

separation type of derivative

0 = [-1 1]

1 = [-1/2 0 1/2]

Outputs: AveTmp array of original ESF values

AveEdge array of derivative (LSF) values

centroid centroid of the derivative

*/

// 计算ESF的差分图像LSF, 并计算LSF的质心

void calculate_derivative(unsigned int len, double *AveTmp, double *AveEdge,

double *centroid,int separation)

{

unsigned long i;

double dt, dt1;

dt = 0.0;

dt1 = 0.0;

for (i=0; i< len; i++)

AveTmp[i] = AveEdge[i];

for (i=1; i< len-separation; i++) {

/* Not wasting time with division by 2 since constant factors don't

change SFR computation */

AveEdge[i] = (AveTmp[i+separation]-AveTmp[i-1]);

if (separation == 1)

AveEdge[i] /= 2.0;

dt += AveEdge[i] * (double)i;

dt1 += AveEdge[i];

}

*centroid = dt/dt1;

AveEdge[0] = AveEdge[1];

if (separation == 1) AveEdge[len-1] = AveEdge[len-2];

}

/*****************************************************************************/

void apply_hamming_window( unsigned short alpha,

unsigned int oldlen,

unsigned short newxwidth,

double *AveEdge, long *pcnt2)

{

long i,j,k, begin, end, edge_offset;

double sfrc;

/* Shift the AvgEdge[i] vector to centre the lsf in the transform window */

// 将LSF的最大值移到中心位置, 两边由于移动造成的空位由0补齐

edge_offset = (*pcnt2) - (oldlen/2);

if (edge_offset != 0) {

if (edge_offset < 0 ) {

for (i=oldlen-1; i > -edge_offset-1; i--)

AveEdge[i] = (AveEdge[i+edge_offset]);

for (i=0; i < -edge_offset; i++)

AveEdge[i] = 0.00; /* last operation */

} else {

for (i=0; i < oldlen-edge_offset; i++)

AveEdge[i] = (AveEdge[i+edge_offset]);

for (i=oldlen-edge_offset; i < oldlen; i++)

AveEdge[i] = 0.00;

}

}

/* Multiply the LSF data by a Hamming window of width NEWXWIDTH*alpha */

// 在当前上下文中, 下面这段代码应该不会起任何作用, 不知道为什么会有这么复杂而冗余的逻辑

begin = (oldlen/2)-(newxwidth*alpha/2);

if (begin < 0) begin = 0;

end = (oldlen/2)+(newxwidth*alpha/2);

if (end > oldlen ) end = oldlen;

for (i=0; i< begin; i++)

AveEdge[i] = 0.0;

for (i=end; i< oldlen; i++)

AveEdge[i] = 0.0;

// 给begin和end之间的数据加上汉明窗

// 汉明窗 W(n,α ) = (1 -α ) - α cos(2*PI*n/(N-1)) ,(0≤n≤N-1)

// 一般情况下,α取0.46

// 下面计算方法等于窗发生了平移(故符号发生了变化), 结果是一样的

for (i=begin,j = -newxwidth*alpha/2; i < end; i++,j++) {

sfrc = 0.54 + 0.46*cos( (M_PI*(double)j)/(newxwidth*alpha/2) );

AveEdge[i] = (AveEdge[i])*sfrc;

}

// 将有效数据平移到起始位置

// 在当前上下文中, 下面这段代码应该不会起任何作用, 不知道为什么会有这么复杂而冗余的逻辑

if (begin != 0) /* Shift LSF to begin at index 0 (rather than begin) */

for (k=0, i=begin; k

/*****************************************************************************/

/* This is the DFT magnitude code */

unsigned short ftwos(long number, double dx, double *lsf,

long ns, double ds, double *sfr)

{

double a, b, twopi, g;

long i,j;

// n-1 k

// DFT ==> X[k] = Σ x[n]e^(-j2π - n)

// n=0 N

twopi = 2.0 * M_PI;

for (j = 0; j < ns; j++){

g = twopi * dx * ds * (double)j;

for (i = 0, a = 0, b = 0; i < number; i++) {

a += lsf[i] * cos(g * (double)(i));

b += lsf[i] * sin(g * (double)(i));

}

sfr[j] = sqrt(a * a + b * b);

}

return 0;

}

matlab汉明窗dft,Mitre_sfr代码注解(四) LSF / 汉明窗 / SFR(DFT)计算相关推荐

  1. 关于MATLAB实现的数字信号处理(四)

    文章目录 3.离散傅里叶变换(DFT) 3.1 用C语言实现DFT 3.2 MATLAB实现DFT 3.3 结果对比 关于MATLAB实现以及C语言实现离散傅里叶变换(DFT)--傅里叶变换的学习与认 ...

  2. FFT频谱分析(补零、频谱泄露、栅栏效应、加窗、细化、频谱混叠、插值),Matlab、C语言代码

    文章目录 引言 Matlab FFT函数 频谱混叠 栅栏效应 细化技术 什么是细化技术? 细化FFT技术的应用: Zoom-FFT算法介绍及MATLAB实现 Zoom-FFT根本没有实现"细 ...

  3. matlab中调用java代码_Matlab中调用第三方Java代码

    在Java中采用Matlab JA Builder可以实现调用m文件,采用这样的方式,可在Matlab的M文件中,直接调用Java类.这种方式可以表示为Java--> Matlab( m, Ja ...

  4. 【Matlab开发】MATLAB编译C/C++代码

    在使用MATLAB编译C/C++代码时,C/C++代码中要使用一个mexFunction函数,那么这个函数是如何定义,在编译时又是如何实现的呢?下面我将使用实例进行说明. 如一个简单的函数: doub ...

  5. python直方图均衡化代码_基于matlab的直方图均衡化代码

    基于matlab的直方图均衡化代码 2007-04-15 20:15 clear all %一,图像的预处理,读入彩***像将其灰度化 PS=imread('1.jpg');             ...

  6. 百度图神经网络——论文节点比赛baseline代码注解

    文章目录 一.项目介绍 二.BaseLine内容注解 1.Config部分注解 2. 数据读取与处理部分 2.1 边数据的加载与处理 2.2 数据的完整加载与处理 2.3 数据读取与分割 3. 模型加 ...

  7. Romberg积分法MATLAB实现(附代码、实例、详解)

    第一部分:问题分析 (1)实验题目:龙贝格积分算法 具体实验要求:用matlab编写龙贝格积分的代码,要求代码实现用户输入了被积函数.积分区间.精度之后,龙贝格积分表(T-数表). (2)实验目的:让 ...

  8. 基于深度神经网络的图像分类与训练系统(MATLAB GUI版,代码+图文详解)

    摘要:本博客详细介绍了基于深度神经网络的图像分类与训练系统的MATLAB实现代码,包括GUI界面和数据集,可选择模型进行图片分类,支持一键训练神经网络.首先介绍了基于GoogleNet.ResNet进 ...

  9. 直方图均衡化 matlab代码,基于matlab的直方图均衡化代码

    基于matlab的直方图均衡化代码 2007-04-15 20:15 clear all %一,图像的预处理,读入彩***像将其灰度化 PS=imread('1.jpg');             ...

  10. 举例说明使用MATLAB Coder从MATLAB生成C/C++代码步骤

    MATLAB Coder可以从MATLAB代码生成独立的.可读性强.可移植的C/C++代码. 使用MATLAB Coder产生代码的3个步骤:准备用于产生代码的MATLAB算法:检查MATLAB代码的 ...

最新文章

  1. Vue2.0环境安装
  2. numpy学习2:数组创建方式
  3. O'Reilly 1500 份问卷调研:2019 年 Serverless 落地到底香不香?
  4. 在ArcGIS中认识 Python工具箱
  5. Java简单验证码的识别
  6. python staticmethod规范_Python Staticmethod可以调用另一个本地方法吗?
  7. 黑历史有救了,淘宝可以改账号名了!网友:终于可以“重新做人”了
  8. mysql 多行唯一_mysql – 具有唯一约束的原子多行更新
  9. zedboard上呼吸灯的实现(第二版)
  10. 【题解】SDOI2018战略游戏
  11. 如何判定某个类的职责是否够“单一”?
  12. FMEA手册第五版学习笔记(一)
  13. 古代汉语复习资料与练习题(适合王力版教材)
  14. 安装nvm下载node,npm以及配置的全过程。解析npm下载包使用 -v指令 发现下载的包不存在的原因。
  15. WPF MVVM框架 漂亮界面风格的WPF
  16. 电脑PHP动画制作画板,Canvas在线画图—简单制作一个画板
  17. djyvp计算机电缆参数,DJYVP计算机电缆2x2x1.5型号规格含义
  18. 物联网竞赛-LoRa和NB-IOT模块学习知识汇总
  19. 编码器脉冲计数器/2路DI高速计数器Modbus RTU模块
  20. openEuler Summit | 江大勇:凝聚创新力量 逐梦数字时代星辰大海

热门文章

  1. android 4.3 用什么微信版本,安卓4.3系统能用微信哪个版本
  2. PHPWAMP自定义添加PHP版本教程,支持无限添加PHP和Mysql版本
  3. ios弱网测试_弱网测试方法整理
  4. linux xbrowser 安装包,xmanager安装包
  5. FreeRTOS-TaskNotify
  6. asc怎么用 linux zip_asc文件扩展名,asc文件怎么打开?
  7. 高仿计算器 双页面浏览器 谷歌内核网页版宝贝类目查询
  8. OpenCV-Python官方文档的查看
  9. 明解c语言练习答案,《明解C语言》练习题4-2的实现
  10. 四川理工学院计算机学院在哪里,四川理工计算机学院