文章目录
- 前言
- 一、仿真分析较少的采集数据
- 1.MATLAB代码
- 2.仿真结果
- 二、高分辨率频谱
- 1.有限信号样本高分辨率频谱的计算方法
- 2.仿真结果
前言
在实际工程应用中,我们很多时候所能采集的信号并不正好是整周期的。此时若对信号做傅里叶变化,得到的结果中包含着多种频谱分量,而实际上我们只需要分析主要的频率分量即可。另一方面,如果采集到的信号样本有限,将导致频谱的分辨率不够高,这也就意味着所得到的主要的频率分量的误差较大。一种有效的处理方法是在有限的信号样本后面补零,然后再进行傅里叶变化得到信号频谱,此时,就可以得到高分辨率的频谱,使所得到的频率分量更加精确。本文将使用MATLAB仿真的方法,给出具体实现方法。
一、仿真分析较少的采集数据
1.MATLAB代码
生成有限信号长度,并进行频谱分析代码如下:
%% 生成余弦波
% 指定信号的参数,频率5Hz,采样频率为32Hz,信号持续时间跨越8个samples。
f = 5; % 余弦波的振荡频率,简称频率
fs = 32; % 数字信号的采样频率(sampling frequency ),简称采样率
Ts = 1/fs; % 采样周期,也即采样值的时间间隔
L = 8; % 一个采样值称为一个sample,L为sample的个数
t = (0:L-1)*Ts; % 时间向量
x = cos(2*pi*f*t); % 生成余弦波x
% 画出生成余弦波的时域波形
figure()
plot(t,x,'LineWidth',1.5)
title(['余弦波的时域波形(f=',num2str(f),'Hz,fs=',num2str(fs),' samples/s)'])
grid on
xlabel('t/s')
ylabel('cos(2*pi*f*t)')
%% 单边幅度谱
N = L; % N=8
Y = fft(x,N); % 信号的傅里叶变换
% 计算信号的双边幅度频谱
P2 = abs(Y/L);
% 计算信号的单边幅度频谱
P1 = P2(1:N/2+1); % 取出直流到fs/2的频谱分量
P1(2:end-1) = 2*P1(2:end-1);
figure()
stem(0:(fs/N):(fs/2),P1(1:N/2+1),'LineWidth',1.5) % 画到fs/2对应的点
grid on
title(['余弦波的单边幅度谱(f=',num2str(f),'Hz,fs=',num2str(fs),' samples/s,','N=',num2str(N),')'])
xlabel('频率(Hz) (单边谱的频率范围0Hz到fs/2)') % 频率范围0Hz到fs/2
ylabel('频谱幅度|Y|')
2.仿真结果
信号波形如下图所示:
直接使用有限的时域信号样本得到的频谱如下图所示:
代码中设置的信号频率是5Hz,由于采集的信号较少,只有8个样本,所以计算得到的频谱分量并不准确,给出的主要频率分量是4Hz,与真是情况偏差较大。
下面给出提高频率分辨率的方法。
二、高分辨率频谱
1.有限信号样本高分辨率频谱的计算方法
通过在时域有限信号样本后面补0,在进行FFT变换,可以得到高分辨率频谱。代码如下:
%% 通过在序列后面补0增加时域的数据量,进而提高频谱分辨率
N = 64;
Y = fft(x,N); % 信号的傅里叶变换。在x后面补0,使新序列长度=N
% 计算信号的双边幅度频谱
P2 = abs(Y/L);
% 计算信号的单边幅度频谱
P1 = P2(1:N/2+1); % 取出直流到fs/2的频谱分量
P1(2:end-1) = 2*P1(2:end-1);
figure()
stem(0:(fs/N):(fs/2),P1(1:N/2+1),'LineWidth',1.5) % 画到fs/2对应的点
grid on
title(['余弦波的单边幅度谱(f=',num2str(f),'Hz,fs=',num2str(fs),' samples/s,','N=',num2str(N),')'])
xlabel('频率(Hz) (单边谱的频率范围0Hz到fs/2)') % 频率范围0Hz到fs/2
ylabel('频谱幅度|Y|')
2.仿真结果
得到的高分辨率频谱如下:
此时,频谱中的主要频率分量是5Hz,和真实的频率一致。