You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 04:20:33