实验二:FFT算法的MATLAB实现

实验内容:

题一:若x(n)=cos(n*pi/6)是一个N=12的有限序列,利用MATLAB计算它的DFT并画出图形。

clc;
N=12;
n=0:N-1;
k=0:N-1;
xn=cos(n*pi/6);
WN=exp(-j*2*pi/N);
nk=n'*k;
WNnk=WN.^nk;
XK=xn*WNnk
plot(k,XK);
xlabel('k');
ylabel('XK');
grid on;

结果:

XK =

  Columns 1 through 8

  -0.0000             6.0000 + 0.0000i  -0.0000 + 0.0000i  -0.0000 - 0.0000i  -0.0000 - 0.0000i  -0.0000 - 0.0000i        0 - 0.0000i   0.0000 - 0.0000i

  Columns 9 through 12

   0.0000 - 0.0000i   0.0000 - 0.0000i   0.0000 - 0.0000i   6.0000 + 0.0000i


题二:一被噪声污染的信号,很难看出它所包含的频率分量,如一个由50Hz120Hz正弦信号构成的信号,受均值随机噪声的干扰,数据采样率为1000Hz,通过FFT来分析其信号频率成分,用MATLAB实现。

clc;
fs=1000;N=128; %采样频率和数据点数
n=0:N-1;t=n/fs; %时间序列
x=sin(2*pi*50*t)+sin(2*pi*120*t)+rand(1,N); %信号
y=fft(x,N); %对信号进行快速Fourier变换
mag=abs(y); %求得Fourier变换后的振幅
f=n*fs/N;   %频率序列
subplot(2,2,1),plot(f,mag); %绘出随频率变化的振幅
xlabel('频率/Hz');
ylabel('振幅');title('N=128');grid on;
subplot(2,2,2),plot(f(1:N/2),mag(1:N/2)); %绘出Nyquist频率之前随频率变化的振幅
xlabel('频率/Hz');
ylabel('振幅');title('N=128');grid on;
%对信号采样数据为1024点的处理
fs=1000;N=1024;n=0:N-1;t=n/fs;
x=sin(2*pi*50*t)+sin(2*pi*120*t)+rand(1,N); %信号
y=fft(x,N); %对信号进行快速Fourier变换
mag=abs(y); %求取Fourier变换的振幅
f=n*fs/N;
subplot(2,2,3),plot(f,mag); %绘出随频率变化的振幅
xlabel('频率/Hz');
ylabel('振幅');title('N=1024');grid on;
subplot(2,2,4)
plot(f(1:N/2),mag(1:N/2)); %绘出Nyquist频率之前随频率变化的振幅
xlabel('频率/Hz');
ylabel('振幅');title('N=1024');grid on;

结果:



题三:调用原始语音信号mtlb,对其进行FFT变换后去掉幅值小于1FFT变换值,最后重构语音信号。

(要求有四幅语音信号的频谱图在同一图形窗口以便比较:分别是1、原始语音信号;2FFT变换;3去掉幅值小于1FFT变换值;4、重构语音信号)

clc;
load mtlb
N=512;
n=1:N;
subplot(2,2,1);plot(n,mtlb(n));
title('原始语音信号');grid on;
y=fft(mtlb(n));
subplot(2,2,2);plot(n,y);
title('原始语音信号的FFT变换'); grid on;
y(y<1)=0;
subplot(2,2,3);plot(n,y);
title('去掉幅值小于1的FFT变换值'); grid on;
subplot(2,2,4);plot(n,ifft(y));
title('重构语音信号');grid on;

结果:



(四)心得体会:1.通过Matlab的仿真,我们可以得到离散序列在时域到频域的变化图形,其实FFTDFT的本质是一样的。还有重构语音信号与原始语音信号差不多,也就是说相当于滤除噪音,这也是FFT的现实应用。2.仔细明白公式原理的过程,然后步步设计思路,最后不停的调试,才能得到想要的结果。3.学以致用,启迪实际应用。


猜你喜欢

转载自blog.csdn.net/CSDNJay/article/details/46628197