FFTSharp中FFTfreqPeriod方法不存在,求替代方案计算人声峰值频率
解决FFTSharp中FFTfreqPeriod方法不存在的问题
替代方案说明
FFTfreqPeriod方法在新版FFTSharp中已被移除,它的核心作用是计算频率分辨率(即FFT结果中每个索引对应的频率间隔),你可以通过两种方式替代:
方式1:手动计算频率分辨率
频率分辨率的计算公式为:Δf = 采样率 / FFT长度,直接用这个公式替代原方法即可,修改后的代码如下:
double [] paddedAudio = FftSharp.Pad.ZeroPad(AudioValues); double [] fftMag = FftSharp.Transform.FFTpower(paddedAudio); Array.Copy(fftMag, FftValues, fftMag.Length); // 找到峰值索引 int peakIndex = 0; for (int i = 0; i < fftMag.Length; i++) { if (fftMag[i] > fftMag[peakIndex]) peakIndex = i; } // 手动计算频率分辨率(替代FFTfreqPeriod) double freqResolution = SampleRate / (double)fftMag.Length; double peakFrequency = freqResolution * peakIndex;
方式2:使用FFTSharp内置的FrequencyScale方法
该方法可以直接生成与FFT结果对应的频率数组,通过索引直接获取对应频率,代码示例:
double [] paddedAudio = FftSharp.Pad.ZeroPad(AudioValues); double [] fftMag = FftSharp.Transform.FFTpower(paddedAudio); Array.Copy(fftMag, FftValues, fftMag.Length); // 生成对应频率数组 double[] frequencies = FftSharp.Transform.FrequencyScale(SampleRate, paddedAudio.Length); // 找到峰值索引 int peakIndex = 0; for (int i = 0; i < fftMag.Length; i++) { if (fftMag[i] > fftMag[peakIndex]) peakIndex = i; } // 直接通过索引获取峰值频率 double peakFrequency = frequencies[peakIndex];
人声频率计算补充提示
人声基频范围大致为:男性85-180Hz,女性165-255Hz,儿童250-300Hz。你可以在寻找峰值时限制索引范围(仅在对应频率区间内查找),避免被高频噪声干扰;如果需要更准确的基频检测,也可以考虑结合自相关算法(FFTSharp中也有相关实现),比单纯找FFT峰值更适合人声这类谐波丰富的信号。
内容的提问来源于stack exchange,提问作者mimmo
相关产品推荐
相关产品推荐

