我有一个Matlab脚本来计算信号的DFT并绘制它:
(可以找到数据here)
clc; clear; close all;
fid = fopen('s.txt');
txt = textscan(fid,'%f');
s = cell2mat(txt);
nFFT = 100;
fs = 24000;
deltaF = fs/nFFT;
FFFT = [0:nFFT/2-1]*deltaF;
win = hann(length(s));
sw = s.*win;
FFT = fft(sw, nFFT)/length(s);
FFT = [FFT(1); 2*FFT(2:nFFT/2)];
absFFT = 20*log10(abs(FFT));
plot(FFFT, absFFT)
grid on
我正在尝试将其转换为Python,但无法得到相同的结果。在
^{pr2}$我得到的图(左边是Matlab,右边是Pyton):
我做错什么了?在
我发现使用
np.fft.rfft
而不是np.fft.fft
并按如下方式修改代码:结果图: right result with Python
我可以看到第一点和最后一点,以及振幅是不一样的。这对我来说不是问题(我对一般的形状更感兴趣),但如果有人能解释,我会很高兴的。在
两个代码在一个情况下是不同的,你连接两个列表
在matlab代码中
另一种方法是将fft的第一个值与向量的其余部分相加
^{pr2}$“+”不要在此处连接,因为您有numpy数组
在python中,它应该是:
我不是Mathlab的用户,所以我不太确定,但有一些事情我想问一下,看看我能不能帮你。在
你打电话来了np.数组数组生成后(ffft)。这可能不会像您希望的那样改变数组的性质,也许最好尝试在
np.array(n * deltaF for n in range(nfft/2-1))
中定义它。我不确定格式,但您明白了。另一件事是我觉得范围不对。你希望它的值是49?在另一个是
fft = fft[0]+ [2*fft[1:nfft/2]]
与FFT = [FFT(1); 2*FFT(2:nFFT/2)];
相比,我不确定这个比较是否准确。对我来说这似乎是另一种定义?在另外,当我做这些类型的计算时,我“打印”出中间的步骤,这样我就可以比较这些数字,看它在哪里断裂。在
希望这有帮助。在
相关问题 更多 >
编程相关推荐