注意fft画图横坐标的设置

来源:互联网 发布:杭州单片机工程师招聘 编辑:程序博客网 时间:2024/06/05 07:48
clear
clc;
t=0:0.001:5;
n=5001;
Fs=1000;
Fc=200;
x=cos(2*pi*Fc*t);
y1=fft(x);
y2=fftshift(y1);
f=(0:5000)*Fs/n-Fs/2;
hold on;
plot((0:5000)*Fs/n,abs(y1),'r') 
%plot(t,abs(y1),'r') 
plot(f,abs(y1),'r') 

plot(f,abs(y2),'b')


一个模拟信号,经过 ADC 采样之后,就变成了数字信号。采样定理告诉我们,采样频率要大于信号
频率的两倍(要满足奈奎斯特采样定律)。
采样得到的数字信号,就可以做 FFT 变换了。N 个采样点,经过 FFT 之后,就可以得到 N 个点的 FFT
结果。为了方便进行 FFT 运算,通常 N 取 2 的整数次方。
假设采样频率为 Fs,信号频率 F,采样点数为 N。那么 FFT 之后结果就是一个为 N 点的复数。每一
个点就对应着一个频率点。这个点的模值,就是该频率值下的幅度特性。具体跟原始信号的幅度有什么关
系呢?假设原始信号的峰值为 A,那么 FFT 的结果的每个点(除了第一个点直流分量之外)的模值就是 A
的 N/2 倍。 而第一个点就是直流分量,它的模值就是直流分量的 N 倍。而每个点的相位呢,就是在该频
率下的信号的相位。第一个点表示直流分量(即 0Hz),而最后一个点 N 的再下一个点(实际上这个点
是不存在的,这里是假设的第 N+1 个点,可以看做是将第一个点分做两半分,另一半移到最后)则表示
采样频率 Fs, 这中间被 N-1 个点平均分成 N 等份, 每个点的频率依次增加。 例如某点 n 所表示的频率为:

          (n − 1)xF s

F n =---------------
               N
由上面的公式可以看出,F n 所能分辨到频率为 F s /N,如果采样频率 F s 为 1024Hz,采样点数为 1024
点,则可以分辨到 1Hz。1024Hz 的采样率采样 1024 点,刚好是 1 秒,也就是说,采样 1 秒时间的信号
并做 FFT,则结果可以分析到 1Hz,如果采样 2 秒时间的信号并做 FFT,则结果可以分析到 0.5Hz。如果

要提高频率分辨力,则必须增加采样点数,也即采样时间。频率分辨率和采样时间是倒数关系。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Fs = 256; % 采样率
N = 256; % 采样点数
n = 0:N-1; % 采样序列
t = 0:1/Fs:1-1/Fs; % 时间序列
f = (-N/2:N/2-1) * Fs / N; %真实的频率
x = 1.5*sin(2*pi*50*t+pi/3) ; %原始信号
y = fft(x, N); %对原始信号做 FFT 变换
Mag = abs(y); %求 FFT 转换结果的模值
subplot(2,1,1);
%plot(n, Mag); %绘制幅频相应曲线
%plot(n* Fs / N, Mag); %绘制幅频相应曲线
plot(f, Mag); %绘制幅频相应曲线
title('fft 幅频相应');
xlabel('频率/Hz');
ylabel('幅度');
z = fftshift(y); %对 FFT 转换后的结果做偏移。
subplot(2,1,2);
plot(f, z); %绘制幅频相应曲线
title('fftshift 幅频相应');
xlabel('频率/Hz');
ylabel('幅度');

0 0
原创粉丝点击