1 回答

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。因此,在可視化結果后,我發(fā)現 440Hz 頻率的幅度實際上對應于調用:
spectrum[371]
代替
spectrum[440]
所以,我的錯誤是 fft ( m ) 的窗口大小與數組的實際長度 ( FrequencySpectrum.FftWindowSize )不對應。
4) 我收到的幅度值較小是因為我測試代碼的音頻文件沒有以足夠的增益錄制。
- 1 回答
- 0 關注
- 178 瀏覽
添加回答
舉報