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

自制DFT实现分析风扇音频输出错误,寻求排查方案

自制DFT实现的频率分析问题

我自行实现了DFT,用于对风扇录制的音频文件进行频率分析,但自己实现的结果与scipy.fft的输出不一致。

音频文件来自10叶风扇的录制,预期基频约为200Hz,频率成分最高到1000Hz。除了绘制频谱图,我还输出了能量占整个信号能量1%以上的频率。

我的实现代码

from scipy.fft import fft
import soundfile as sf
import numpy as np
import matplotlib.pyplot as plt
from pydub import AudioSegment

def dft(filename):
    
    # 读取音频文件
    audio_seg = AudioSegment.from_file(filename)
    data = audio_seg.set_channels(1).get_array_of_samples()

    N = len(data)
    n = np.arange(0, N)
    k = np.linspace(1, 1000, 1500)

    X = np.zeros(len(k))

    # 生成正弦波并计算点积
    for i in range (0, len(k)):

        base_sinusoid = np.exp(-2j * np.pi * k[i] * n / N)

        dot_product = np.dot(data, base_sinusoid)
    
        X[i] = np.abs(dot_product)

    # 计算信号总能量
    energy_sum = np.sum(X ** 2)

    # 筛选能量占比≥1%的频率
    present_frequencies = k[(X ** 2) * 100 / energy_sum >= 1]

    print("存在的频率:", present_frequencies)
        
    plt.figure(1)
    
    plt.title("频率分析") 
    plt.xlabel("频率")
    plt.ylabel("幅值")
    
    plt.plot(k, X)
    
    plt.show()

调用方式:

dft(<绝对路径>)

问题分析

我怀疑问题出在频率分辨率不正确——自行生成正弦波时可能选了错误的频率点。我认为第8行不应该生成1500个频率,而应该生成N个,但这样会导致执行时间过长。我尝试过修改最大频率和频率bin的宽度,但都没有效果。之前用这个函数分析3秒元音音频时输出正确,唯一区别是当时把第8行的最大频率设为20000。

编辑补充:已经为代码添加注释,并改进了能量计算方式。另外需要明确:我不能使用scipy的fft或fftfreq。


内容的提问来源于stack exchange,提问作者sudoMeerkat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 23:05:04