首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FFT结果Matlab VS Numpy (Python):不同的结果

FFT结果Matlab VS Numpy (Python):不同的结果
EN

Stack Overflow用户
提问于 2017-06-21 21:04:46
回答 3查看 6.6K关注 0票数 2

我有一个计算信号DFT并绘制它的Matlab脚本:

(数据可以在here上找到)

代码语言:javascript
复制
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,但不能得到相同的结果。

代码语言:javascript
复制
import numpy as np
from matplotlib import pyplot as plt

x = np.genfromtxt("s.txt", delimiter='  ')

nfft = 100
fs = 24000
deltaF = fs/nfft;
ffft = [n * deltaF for n in range(nfft/2-1)]
ffft = np.array(ffft)
window = np.hanning(len(x))

xw = np.multiply(x, window)
fft = np.fft.fft(xw, nfft)/len(x)
fft = fft[0]+ [2*fft[1:nfft/2]]
fftabs = 20*np.log10(np.absolute(fft))

plt.figure()
plt.plot(ffft, np.transpose(fftabs))
plt.grid()

我得到的图(Matlab在左边,Python在右边):

我做错了什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-06-21 22:07:44

这两个代码是不同的,在一种情况下,你连接两个列表

代码语言:javascript
复制
FFT = [FFT(1); 2*FFT(2:nFFT/2)];

在matlab代码中

在另一种方法中,将fft的第一个值与向量的其余部分相加

代码语言:javascript
复制
fft = fft[0]+ [2*fft[1:nfft/2]]

'+‘不要在这里连接,因为您有numpy数组

在python中,它应该是:

代码语言:javascript
复制
fft = fft[0:nfft/2]
fft[1:nfft/2] =  2*fft[1:nfft/2]
票数 3
EN

Stack Overflow用户

发布于 2017-06-21 21:22:00

我不是Mathlab的用户,所以我不确定,但我会问一些事情,看看我是否能帮助你。

您在生成数组后调用了np.array (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)];的比较,我不确定这个比较是否准确。这对我来说似乎是一种不同类型的定义?

此外,当我做这些类型的计算时,我会‘打印’出中间步骤,这样我就可以比较数字,看看它在哪里折断。

希望这能有所帮助。

票数 0
EN

Stack Overflow用户

发布于 2017-06-21 22:27:47

我发现,使用np.fft.rfft而不是np.fft.fft并按如下方式修改代码可以完成以下工作:

代码语言:javascript
复制
import numpy as np
from matplotlib import pyplot as pl

x = np.genfromtxt("../Matlab/s.txt", delimiter='  ')

nfft = 100
fs = 24000
deltaF = fs/nfft;
ffft = np.array([n * deltaF for n in range(nfft/2+1)])
window = np.hanning(len(x))

xw = np.multiply(x, window)
fft = np.fft.rfft(xw, nfft)/len(x)
fftabs = 20*np.log10(np.absolute(fft))

pl.figure()
pl.plot(np.transpose(ffft), fftabs)
pl.grid()

结果图:right result with Python

我可以看到第一个点和最后一个点,以及振幅都不一样。这对我来说不是问题(我对一般的形状更感兴趣),但如果有人能解释,我会很高兴。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44677001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档