matlab进行傅里叶变换fft和shiftfft

使用matlab进行傅里叶变换

模拟信号进行奈奎斯特采样后成为离散的数字信号,时域分析不太方便,通常要进行频域变换更好的分析信号,matlab中的fft和shiftfft两个函数可以快速的帮助我们进行频谱分析。两个函数存在一些差别。

关于fft的预备知识:

由奈奎斯特采样定理知,要使信号无失真的还原,频谱不出现混叠,采样频率必须是信号(基带信号)最高频率的两倍。这里设信号频率f=100HZ,采样频率Fs=500HZ,采样点N=8192。Fs/N是频谱分辨率,就是频谱中两根谱线的间距,理论上N越大,频谱越好,但是硬件实现要求高,FFT蝶形运算的开销和时间都会增加,这里就不讨论了。fft(x)运算后得到的是N的结果对应[0,fs]频点的对应的值,进行(abs(fft(x))*2/N)后才是频斜体样式点对应的真是幅度值,其中abs是数值的绝对值和复数的幅值。这里abs(fft(x))出来并不是真正的幅度值,还需要(*2/N),如果是支流部分是1/N,不需要乘2,之所以有这个操作和matlab的fft内部积分求和实现有关,可以看作是一种归一化处理吧。

实信号的频谱分析:

实信号的频谱特点:关于原点对称,是双边谱。
使用fft得到只有正频域的,如图1,我们可以在正频率部分看到两根谱线,一根在100HZ,一根在400HZ,有数字信号处理的知识可知这是因为进行了时域的采样,采样频率500HZ,使得频域出现周期性,周期为500HZ,相当与把频谱从零频搬移到了500HZ处,我们看到的400HZ处的谱线,实际是-100处的谱线搬移过来的。
为了看到负频率部分的频谱,我们可以使用shiftfft函数,效果如图2。使用shiftfft时需要注意的是横坐标刻度是[-fs/2,fs/2]。

% clear all; close all; clc;
f=100;%信号频率
Fs=500;%采样频率
ts=1/Fs;%采样时间间隔
N=8192;%采样点数
t=0:t:(N-1)*t;
x=100*sin(2*pi*f*t);%单音信号
    
figure(1);
f1_index=(0:N-1)*(Fs/N);
y1=abs(fft(x)).*2/N;
subplot(2,2,1);
plot(f1_index,y1);
xlabel('频率(Hz)');ylabel('幅度(V)');title('fft sin');
    
f2_index = (-N/2:(N-1)/2)*(Fs/N);
y2=abs(fftshift(fft(x))).*2/N;
subplot(2,2,2);
plot(f2_index,y2);
xlabel('频率(Hz)');ylabel('幅度(V)');title('fftshift sin');
    
PYf1 =20*log10(y1);
subplot(2,2,3);
plot(f1_index,PYf1);
xlabel('频率(Hz)');ylabel('幅度(dB)');title('fft sin');
    
PYf2 =20*log10(y2);
subplot(2,2,4);
plot(f2_index,PYf2);
xlabel('频率(Hz)');ylabel('幅度(dB)');title('fftshift sin');

在这里插入图片描述

复信号的频谱分析:

复信号是实际信号处理常用的表示形式:x=x_re+j*x_im;分为实部和虚部,虚部是实部的希尔伯特变换。
复信号的频谱特点:只存在正频域部分,单边谱。
同样使用fft和shiftfft进行分析。
从图中可以看出,复信号频谱只有正频域部分。

% clear all; close all; clc;
f=100;%信号频率
Fs=500;%采样频率
N=8192;%采样点数
ts=1/Fs;
t=0:ts:(N-1)*ts;
x_re=100*cos(2*pi*f*t);%单音实部
x_im=100*sin(2*pi*f*t);%单音虚部
x=x_re+1i*x_im;
    
figure(1);
f1_index=(0:N-1)*(Fs/N);
y1=abs(fft(x)).*2/N;
subplot(2,1,1);
plot(f1_index,y1);
xlabel('频率(Hz)');ylabel('幅度(V)');title('fft complex');
    
f2_index = (-N/2:(N-1)/2)*(Fs/N);
y2=abs(fftshift(fft(x))).*2/N;
subplot(2,1,2);
plot(f2_index,y2);
xlabel('频率(Hz)');ylabel('幅度(V)');title('fftshift complex');

在这里插入图片描述

参考链接:https://ww2.mathworks.cn/help/matlab/ref/fft.html

猜你喜欢

转载自blog.csdn.net/qq_29689907/article/details/82793459