第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

NAudio FFT 為所有頻率返回小而相等的幅度值

NAudio FFT 為所有頻率返回小而相等的幅度值

C#
手掌心 2022-12-04 10:55:22
我正在使用 NAudio 1.9 進行一個項目,我想計算整首歌曲的 fft,即將歌曲分成大小相等的塊,然后為每個塊計算 fft。問題是 NAudio FFT 函數對于頻譜中的任何頻率都返回非常小且相等的值。我搜索了以前的相關帖子,但似乎沒有一個對我有幫助。使用 NAudio 計算 FFT 的代碼:public IList<FrequencySpectrum> Fft(uint windowSize) {        IList<Complex[]> timeDomainChunks = this.SplitInChunks(this.audioContent, windowSize);        return timeDomainChunks.Select(this.ToFrequencySpectrum).ToList();}private IList<Complex[]> SplitInChunks(float[] audioContent, uint chunkSize) {        IList<Complex[]> splittedContent = new List<Complex[]>();        for (uint k = 0; k < audioContent.Length; k += chunkSize) {            long size = k + chunkSize < audioContent.Length ? chunkSize : audioContent.Length - k;            Complex[] chunk = new Complex[size];            for (int i = 0; i < chunk.Length; i++) {                //i've tried windowing here but didn't seem to help me                chunk[i].X = audioContent[k + i];                chunk[i].Y = 0;            }            splittedContent.Add(chunk);        }        return splittedContent;}private FrequencySpectrum ToFrequencySpectrum(Complex[] timeDomain) {        int m = (int) Math.Log(timeDomain.Length, 2);        //true = forward fft        FastFourierTransform.FFT(true, m, timeDomain);        return new FrequencySpectrum(timeDomain, 44100);}頻譜:public struct FrequencySpectrum {    private readonly Complex[] frequencyDomain;    private readonly uint samplingFrequency;     public FrequencySpectrum(Complex[] frequencyDomain, uint samplingFrequency) {        if (frequencyDomain.Length == 0) {            throw new ArgumentException("Argument value must be greater than 0", nameof(frequencyDomain));        }        if (samplingFrequency == 0) {            throw new ArgumentException("Argument value must be greater than 0", nameof(samplingFrequency));        }        this.frequencyDomain = frequencyDomain;        this.samplingFrequency = samplingFrequency;    }對于包含 440Hz 正弦波的文件預期輸出:freq=440 的值為 0.5,其他值為 0實際輸出:頻譜中任何頻率的值如 0.000168153987f
查看完整描述

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) 我收到的幅度值較小是因為我測試代碼的音頻文件沒有以足夠的增益錄制。


查看完整回答
反對 回復 2022-12-04
  • 1 回答
  • 0 關注
  • 178 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號