概述
为什么matlab中的fft运算后想要得到信号的幅值需要对运算结果的幅值进行乘2除N
对于一个时域信号x(t),采样频率为Fs,信号频率F,采样点数为N,进行N采样后为y[n],则fft(y,N)计算所得的结果就是一个为N点的复数a+bi.
每一个点就对应着一个频率点.这个点的模值,就是该频率值下的幅度特性.
得到的频率点与相应点处的模值与原始信号的频率和幅度有什么关系?
1.频率点:实际信号第n点处的频率是nFs/N
2.幅度:第n(其中n!=1)点处的fft计算的结果是复数a+bi,模值A=sqrt(a2+b2),那么实际信号的幅度是2A/N;
当n=0时(0Hz),第一个点就是直流分量,它的模值就是直流分量的N倍,那么实际信号的幅度是A/N,注意N是采样点而不是进行FFT的点数
3.相位:每个点处的相位就是该频率下信号的相位。
matlab自带的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.7sin(2pi50t) + sin(2pi120t);
y = x + 2randn(size(t)); % Sinusoids plus noise增加的是一个1000点的随机噪声
plot(Fst(1:50),y(1:50)) % 绘制时域信号图,取前50点
title(‘Signal Corrupted with Zero-Mean Random Noise’)
xlabel(‘time (milliseconds)’)
NFFT = 2^nextpow2(L); % 主要用于计算L点最近的2的整数次幂的点数,此处采样为1000点,离它最近的是1024,所以NFFT是1024
Y = fft(y,NFFT)/L; %Y是复数矩阵,已经在此处除以L了,注意除的是L不是NFFT
f = Fs/2*linspace(0,1,NFFT/2+1);%频率分辨率矩阵,linspace将0-1平均分成NFFT/2份
% Plot single-sided amplitude spectrum.
plot(f,2*abs(Y(1:NFFT/2+1))) �s计算模值,前面已经除以L了,此处绘图时候仅乘以2,这样绘制的频谱图就是时域信号对应频率点的真实幅值
title(‘Single-Sided Amplitude Spectrum of y(t)’)
xlabel(‘Frequency (Hz)’)
ylabel(’|Y(f)|’)
原因是DFT的频谱是用谱密度定义的,即它的幅值表示的是单位带宽的幅值。 N 个离散点的DFT(我这里说的是实数DFT)将产生 N2+1 个频率点,频率的序号是从 0∼N2 ,需要注意,如果是复数,N 点DFT将产生 N 个频率点。所以 N 点实数DFT以后,频谱带宽是 N2 ,每个频率点占的带宽是 2N ,所以每个频率的实际幅值需要用DFT后的幅值乘以 2N ,也就是除以 N2 。但是注意,频率序号为 0 和 N2 的两个点带宽只占中间频率点的一半,也就是占 1N 的带宽,所以首尾两个点的幅值需要乘以 1N ,也就是除以 N 。FFT是DFT的快速算法,所以FFT也需要这样处理,才能得到每个频率点真正的幅值。
最后
以上就是儒雅鱼为你收集整理的matlab计算幅度的全部内容,希望文章能够帮你解决matlab计算幅度所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复