有些地方不懂,勉强写出来,求砖。
private void CreateFLow(int fsml, int f_kernel, double x) { int M = f_kernel; double k = 500 / fsml; double sum = 0; LHZ = new double[M]; double FC = x * k; for (int i = 0;i < M; i++) { if ((i - M / 2) == 0) //信号LHZ, //中点的值为 2 * PI * FC, 即 2 * PI * x * 500/fsml. //其实这个 For 循环只是使用了同一个计算公式, //这个 if 分支把 ((i - M / 2) == 0) 的情况拎出来, //是为了避免下面 除以 (i-M/2) 时数值出现错误。 //手工计算的话, //信号中点的值刚好为 sin( 2 * PI * FC ) * ( 0.54 - 0.46* cos( 2 * PI * 1/2 )), ... // = sin( 2 * PI * FC ) * ( 0.54 - 0.46* ( -1 )), ... // = sin( 2 * PI * FC). // 原因: x趋于0时, sin(x)/x 趋于1。 // // CodeAnt // 2011.04.11 LHZ[i] = 2 * PI * FC; if (0 > (i - M/2) | 0 < (i - M/2)) LHZ[i] = Math.Sin(2 * PI * FC * (i - M / 2))/(i - M /2); // (0.54 - 0.46 * Math.Cos(2 * PI * i / M))即是汉宁窗, // 只是 0.54 和0.46 两个系数作了微调。 // 至于前面乘上的 Sin(2 * PI * FC * (i - M / 2))/(i - M /2), 是一个系数, // 可能是作者的优化。 // // CodeAnt // 2011.04.11 LHZ[i] = LHZ[i] * (0.54 - 0.46 * Math.Cos(2 * PI * i / M)); } //以下为求信号LHZ中各点值在整列信号中所占的百分比, //并用百分比覆盖原信号 sum = 0; for (int i = 0; i < M; i++) { sum = sum + LHZ[i]; } for (int i = 0; i < M; i++) { LHZ[i] = LHZ[i] / sum; } }
以上就是活泼花生最近收集整理的关于FFT中的汉宁窗 C#的全部内容,更多相关FFT中的汉宁窗内容请搜索靠谱客的其他文章。
发表评论 取消回复