24小时热门版块排行榜    

CyRhmU.jpeg
查看: 2081  |  回复: 18
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

xunking

银虫 (初入文坛)

[求助] FFT算法的一个问题请教

以下是matlab 的help fft 文档中的实例,有一个问题不太明白,望不吝指教:
Fs = 1000;                    % Sampling frequency
T = 1/Fs;                     % Sample time
L = 1000;                     % Length of signal
t = (0:L-1)*T;                % Time vector
% Sum of a 50 Hz sinusoid and a 120 Hz sinusoid
x = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t);
y = x + 2*randn(size(t));     % Sinusoids plus noise
plot(Fs*t(1:50),y(1:50))
title('Signal Corrupted with Zero-Mean Random Noise')
xlabel('time (milliseconds)')

NFFT = 2^nextpow2(L); % Next power of 2 from length of y
Y = fft(y,NFFT)/L;
f = Fs/2*linspace(0,1,NFFT/2);

% Plot single-sided amplitude spectrum.
plot(f,2*abs(Y(1:NFFT/2)))
title('Single-Sided Amplitude Spectrum of y(t)')
xlabel('Frequency (Hz)')
ylabel('|Y(f)|')

请问这里"Y = fft(y,NFFT)/L;”
为什么是除以L,而不是除以NFFT。
L点x序列补零后使之成为长NFFT点的序列,由IFFT的定义应该是除以NFFT才对啊?但是实验情况确实除以L,不知道是不是MATLAB里补零后FFT的定义不一样了。

我实验中验证了,确实应该除以L而不应该是NFFT。
(NFFT=2^15长度的FFT变换,fft除以长度L,幅值才大概是对的大概,除以NFFT反而不对,实验如下:
n=1:1024;
LL=1024;
Vs=sin(2*pi*100*n/1000);
y=fft(Vs,2^15)/LL;%y=fft(Vs,2^15)/2^15
figure;plot((1:2^15)/2^15*1000,2*abs(y))
)
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

nakada3861

新虫 (正式写手)

【答案】应助回帖

★ ★
感谢参与,应助指数 +1
xunking: 金币+2, 有帮助 2012-04-23 18:34:23
因为能量只在这L点上啊,实际信号的长度就是L。
6楼2012-04-23 18:07:54
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
查看全部 19 个回答

noreason2

新虫 (著名写手)

【答案】应助回帖

★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★
感谢参与,应助指数 +1
xunking: 金币+5, 有帮助, 谢谢 2012-04-23 16:04:23
xunking: 金币+8, ★★★很有帮助 2012-04-25 18:58:08
虽然用FFT算出的点由于填0的原因数量多了,但是只有前L点有效,所以应该除以L。看看这篇论文:
2楼2012-04-23 13:11:54
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

afu2007

铁杆木虫 (职业作家)

请教:
plot((1:2^15)/2^15*1000,2*abs(y))
这条语句里面为什么是2*abs(y),而不是abs(y)
3楼2012-04-23 13:20:35
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

xunking

银虫 (初入文坛)

引用回帖:
2楼: Originally posted by noreason2 at 2012-04-23 13:11:54:
虽然用FFT算出的点由于填0的原因数量多了,但是只有前L点有效,所以应该除以L。看看这篇论文:
<FFT补零充位问题的补充>

谢谢你的回复。
我大概理解了,这确实是一个好问题,可能很多人在学习中忽略了。我觉得应该如下理解:
从帕斯瓦尔定理,即sum(Vs(n)^2)=sum(|y(k)|^2)/NFFT,当补充零点后每个转换的“幅值”确实应该下降的。因为补零后频域更密集的采样,如果原来对应的幅值仍然不变的话,能量就不守恒了。所以补零后由y(k)计算的信号幅值不是原始信号幅值,其中需要一个比例的变换。
所以正确的理解过程应该如下:
n=1:1024;
LL=1024;
Vs=sin(2*pi*100*n/1000);
y=fft(Vs,2^15)/2^15
y_real=y*2^15/LL %增加一个比例变换
figure;plot((1:2^15)/2^15*1000,2*abs(y_real))
4楼2012-04-23 16:00:54
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
信息提示
请填处理意见