1 回答
![?](http://img1.sycdn.imooc.com/54584f3100019e9702200220-100-100.jpg)
TA贡献1807条经验 获得超9个赞
看来我犯了4个错误:
1) 在这里我假设采样频率是 44100。但这不是我的代码不工作的原因,虽然
return new FrequencySpectrum(timeDomain, 44100);
2)始终对输出数据进行可视化表示!我必须吸取这一课......似乎对于包含 440Hz 正弦波的文件我得到了正确的结果但是......
3) 由于这个原因,频谱与我的预期略有不同:
int m = (int) Math.Log(timeDomain.Length, 2);
FastFourierTransform.FFT(true, m, timeDomain);
timeDomain 是一个大小为 44100 的数组,因为它是 windowSize 的值(我用 windowSize = 44100 调用了该方法),但是 FFT 方法需要一个值为 2 的窗口大小。我说“这里,NAudio,计算我该数组的 fft 具有 44100 个元素,但只考虑前 32768"。我没有意识到这会对结果产生严重影响:
float k = freq / ((float) this.samplingFrequency / this.FftWindowSize);
这里 this.FftWindowSize 是一个基于数组大小的属性,而不是m。因此,在可视化结果后,我发现 440Hz 频率的幅度实际上对应于调用:
spectrum[371]
代替
spectrum[440]
所以,我的错误是 fft ( m ) 的窗口大小与数组的实际长度 ( FrequencySpectrum.FftWindowSize )不对应。
4) 我收到的幅度值较小是因为我测试代码的音频文件没有以足够的增益录制。
- 1 回答
- 0 关注
- 138 浏览
添加回答
举报