- 先看代码和图
clc,clear,close all
Fs = 256; % 采样率 256Hz
N = 256; % 采样点数 256点
% 频率分辨率 delta_f = Fs/N = 1Hz
T = 1; % % 采样时间 T = N / Fs = 1s
t = linspace(0,T,N);
% 第二种坐标生成方式,注意时间从0开始,所以最后一项要减去一个刻度
t1 = 0:1/Fs:(N-1)/Fs;
f1 = linspace(0,Fs,N); % 频率有误差
f = (0:N-1)*Fs/N; % 生成频率值更准确
f_fftshift = linspace(-Fs/2,Fs/2,N);
s = 2+3*sin(2*30*pi*t)+sin(2*100*pi*t);
plot(s)
grid
title('原始信号')
figure
y = fft(s,N);
subplot(411);
A = abs(y); % 幅度的模值
plot(f,A);
subplot(412);
A = abs(y); % 幅度的模值
plot(f(1:N/2),A(1:N/2));
subplot(413)
A1 = fftshift(A);
plot(f_fftshift,A1)
subplot(414)
A2 = A/(N/2);
plot(f(1:N/2),A2(1:N/2))
- 要点一,采样率和点数的选择
采样时间 T = N / Fs (点数 / 采样率 = (每秒采集点数)) ,采样率一定,增加采样点数可以增加采样时间
频谱分辨率 Fn = Fs / N (采样率 / 点数),增加采样点数可以提高频率分辨率
采样时间和频率分辨率成倒数关系,即增加采样时间可以提高频率分辨率 - 要点二:坐标轴的生成
- 坐标t的生成两种方式没有差异,直接使用刻度生成,注意时间从0开始,所以最后一项要减去一个刻度保持点数相同
- 坐标f的生成两种方式有差异,尽量使用更精确的用数组生成,但我更喜欢linspace方式,因为可以一眼知道点数是多少,不怕出错
- 要点三,改进幅值,除以
N/2
- 以下为改进的代码和图
clc,clear,close all
Fs = 256; % 采样率 256Hz
N = 256; % 采样点数 256点
% 频率分辨率 delta_f = Fs/N = 1Hz
T = 1; % % 采样时间 T = N/Fs = 1s
t = linspace(0,T,N);
f = (0:N-1)*Fs/N;
f_fftshift = linspace(-Fs/2,Fs/2,N);
s = 2+3*sin(2*30*pi*t)+sin(2*100*pi*t);
plot(t,s)
grid
title('原始信号')
figure
y = fft(s,N);
subplot(211);
A = abs(y)/(N/2); % 幅度的模值
plot(f(1:N/2),A(1:N/2));
grid on
subplot(212)
A1 = fftshift(A);
plot(f_fftshift,A1)
- 还可以改变参数,继续观察频谱混叠的情况,(如果写了)下期见。。