自制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
相关产品推荐
相关产品推荐

