下载《标准实验报告》 1 2 3 4 注意:请按时上传作业!到时将自动关机! 18:16:06
程序、图、结果 18:16:06
2018/12/3 实验一 离散傅立叶变换的性质及应用 18:16:06
一、实验目的 1.熟悉 MATLAB 编程; 2.了解 DFT 的性质及其应用。 18:16:06
二、实验要求 1.用三种不同的 DFT 程序计算序列 x(n)的离散傅立叶变换 X(k),并比较三种程序计算机运算时间; 2.利用 DFT 实现两个序列的线性卷积运算,并研究DFT点数与混叠的关系。 3.利用FFT/IFFT实现简单的频域滤波。 特别强调:如果只是直接运行给出的程序,而不加以改造,则本次实验成绩最多只给一半的成绩。 18:16:06
三、实验内容 1. 用三种方法计算 x(n)=R8(n) 的DFT结果 X(k): (1)直接利用DFT公式 (2)利用矩阵形式 (3)利用FFT 要求: (1)三种方式分别写成三个函数,在主程序中调用; (2)比较三种程序计算机运算时间。 18:16:06
(1)直接利用公式,以循环变量逐点计算的方式计算 X(k): 18:16:06
直接利用公式计算DFT: 注意:MATLAB要求文件名要与函数名相同。如对于本函数,存储的文件名应为dft1.m function [Am, pha] = dft1(x) N = length(x); w = exp(-j*2*pi/N); for k = 1:N sum = 0; for n = 1:N sum = sum + x(n) * w^((k-1)*(n-1)); end Am(k) = abs(sum); pha(k) = angle(sum); 注意:MATLAB要求文件名要与函数名相同。如对于本函数,存储的文件名应为dft1.m 18:16:06
(2)用矩阵运算的方式计算 X(k): 18:16:06
例如,对于N=4点的DFT,就可以表示成 18:16:06
利用矩阵形式计算DFT: function [Am, pha] = dft2(x) N = length(x); n = [0:N-1]; k = [0:N-1]; w = exp(-j*2*pi/N); nk = n' * k; wnk = w.^(nk); Xk = x * wnk; Am = abs(Xk); pha = angle(Xk); 18:16:06
18:16:06
(3)直接调用MATLAB的FFT函数计算X(k)。 18:16:06
(4)在主程序中调用上述三种方式计算X(k): (a)比较三种方式的运行时间; (b)画出相应的幅度谱和相位谱。 18:16:06
x = [my, zeros(1,246)]; %为了对比时间,加长序列 t = cputime; %函数cputime获得系统当前时间 [Am1,pha1] = dft1(x); %分别调用dft1,dft2,dft3 t1 = cputime - t; %计算花费的时间 n = [0:(length(x)-1)]; w = (2*pi/length(x))*n; %准备谱的x坐标 figure(1) subplot(2,1,1), plot(w,Am1,'b'); %'b'表示用blue颜色画线 title('幅度谱'); xlabel('frequency in radians'); ylabel('|X(k)|'); subplot(2,1,2), plot(w,pha1,'r'); grid; title('相位谱'); ylabel('arg(X[k)])'); 18:16:06
2.用DFT实现两个序列的卷积运算 后取主值序列的结果. 18:16:06
提示1: %用DFT实现循环卷积 x = [1 1 1]; y = [2 3 4 5]; N = 5; XK = fft(x, N); YK = fft(y, N); f = ifft(XK .* YK); 18:16:06
实验要求: (1)自己构造两个有限长序列 x(n)、h(n); (2)利用conv函数计算两个序列的线性卷积; 提示:y=conv(x,h); (3)分别计算不同点的循环卷积(利用FFT/IFFT计算);什么时候循环卷积与线性卷积相同?请总结规律。 18:16:06
自己构造有限长的序列x[], y[]: x = ???; %用自己的学号构造有限长序列x; y = ???; %自己任意构造有限长序列y; N = ???; % 根据序列x,y的长度选择3个N值 XK = fft(x, N); YK = fft(y, N); f = ifft(XK .* YK); figure(1); stem(f); title(['用DFT计算线性卷积: N=' num2str(N)]); ycov=conv(x,y); %调用conv计算线性卷积 figure(2); stem(ycov); title('调用CONV计算线性卷积'); 18:16:06
3.利用FFT/IFFT实现简单的频域滤波 要求与思路: (1)构造一低频离散信号f; (2)在此低频信号上添加高频随机噪声得到混合信号g; (3)对信号g进行FFT变换得到其幅度谱和相位谱; (4)对高于某个频率的幅度谱全部置为0; (5)利用IFFT对频谱做反变换得到滤波后的信号f’; (6)画图比较 f 和 f’。 --------部分提示见下页…. 18:16:06
%random(m,n):生成一个m*n的0.0~1.0间的随机数矩阵 noise = rand(1,nx)-0.5; %生成一个正弦离散信号: x1=[1:nx]; y1=sin(x1*0.3); %生成随机高频噪声: %random(m,n):生成一个m*n的0.0~1.0间的随机数矩阵 noise = rand(1,nx)-0.5; %在信号上面添加随机高频噪声: y2=y1+noise; %等价于下面的2行: %for i=1:nx % y2[i] = y1[i] + noise[i]; %分别用红色实线、兰色虚线在同一个图上画线: plot(x1,y1,'r',x1,y2,'b:'); 18:16:06
上页程序的运行结果如下: 18:16:06
y1=sin(x1*0.3); %自己构造有用的信号/序列 noise=rand(1,nx)-0.5; y2=y1+noise; x1=[1:nx]; y1=sin(x1*0.3); %自己构造有用的信号/序列 noise=rand(1,nx)-0.5; y2=y1+noise; figure(1); plot(x1,y1,'r',x1,y2,'b:'); XXX=fft(y2); figure(2); plot(abs(XXX)); title('信号的幅度谱'); %改造频谱,实现滤波 for i=10:nx-10+1 %自己选择合适滤波范围 XXX(i)=0; end f1=ifft(XXX); figure(3); plot(x1,y1,'r',x1,f1,'b:'); title('滤波的效果'); 18:16:06
18:16:06
18:16:06
18:16:06
特别强调:如果只是直接运行给出的程序,而不加以改造,则本次实验成绩最多只给一半的成绩。 18:16:06