关于矩形窗函数DFT和FFT的笔记

一直想写这个程序,今日终于如尝所愿,非常开心!
矩形窗函数的FT是个什么样子呢?
1、先从理论上分析一下,如图所示(贼简单):关于矩形窗函数DFT和FFT的笔记_第1张图片
我们在二维坐标系里只能画出信号的幅度谱 |F(w)| ,那么矩形窗的幅度谱是啥形状呢?(本科的时候快把Sa函数的图画烂了):
关于矩形窗函数DFT和FFT的笔记_第2张图片
这时,我想啊,如果是它的时移信号呢?根据FT的时移性质很容易得到:关于矩形窗函数DFT和FFT的笔记_第3张图片
但是在画幅度谱时,是要对信号的FT求模滴!所以,幅度谱不会包含时移信息,而是时移信息包含在信号的相位谱中。因此无论时域信号怎么平移,频域的幅度谱时不变的。
到这里就清楚了,只要是矩形窗函数形状的信号,它的FT都是长一样的,都是Sa函数的形状。
2、从实际中分析一下
于是乎,我就写了第一个程序,计算 x(n)=1 (n=0,1,……,N-1),的DFT:

N=16;           % 窗函数长度
x=rectwin(N);   % 产生0到(N-1)的矩形窗函数
n=0:N-1;        % 离散时间变量
X=zeros(1,N);   % 用于储存FT值
subplot(311);stem(n,x,'.'),grid on
xlabel('n'),ylabel('x(n)'),title('原始信号');

for k=0:N-1 % 计算DFT
   for n=0:N-1	 % MATLAB的下表索引从1开始,所以为了得到正确的结果要进行处理
      X(k+1)=X(k+1)+x(n+1)*exp(-1i*2*pi*n*k/N);
   end
end
k=0:N-1;
subplot(312),stem(k,abs(X),'.');grid on
xlabel('k'),ylabel('X(k)'),title('DFT');

y=fft(x,N); % 计算FFT,验证上面的DFT算法
subplot(313);stem(k,abs(y),'.');grid on
xlabel('k');ylabel('X(k)');title('FFT');

结果如下:关于矩形窗函数DFT和FFT的笔记_第4张图片
我在这里遇到了一个很大的,为什么只有在零点的值是对的,说好的Sa函数呢?FFT和DFT计算结果是一样的,说明我的程序没错啊,但是结果为什么不对?我又手算了一下,结果是一样的,通过欧拉公式很容易证明下面的结论:关于矩形窗函数DFT和FFT的笔记_第5张图片
这时,我想到了一个问题,FFT或者DFT认为,在没有信号 的位置是信号的周期延拓,这样频域的信号才能倍离散化,才能用计算机表示。所以在上述程序中,是信号 x(n) 的定义出现了问题。不光需要定义值为1的位置,还需要定义值为0的位置,不然经过周期延拓后,上述程序实际求的是常数1的DFT,当然是一个只有在零点有值得频谱。
3、正确的程序
于是我又写了第二个程序:

fs=1;   	  % Sampling Frequency
ts=1/fs;   	 % Sampling Time
N=16;    	  % Sampling points
L=N*ts;    	 % Length of Signal
t=(0:N-1)*ts;   % Time Vector
t0=0; t1=10;    % t1-t0 为脉宽
X=zeros(1,N);   % 用于储存FT值

ut1=stepfun(t,t0);		% 产生阶跃函数
ut2=stepfun(t,t1);
x=ut1-ut2; 		% 产生0-9的窗函数
subplot(311);
stem(t,x);grid on
xlabel('n'),ylabel('x(n)'),title('原始信号');

for k=0:N-1 		% 计算DFT
   for n=0:N-1  		% MATLAB的下表索引从1开始,所以为了得到正确的结果要进行处理
      X(k+1)=X(k+1)+x(n+1)*exp(-1i*2*pi*n*k/N);
   end
end
k=0:N-1;
subplot(312),stem(k,abs(X),'.');grid on
xlabel('k'),ylabel('X(k)'),title('DFT');

Uw=fft(x,N);
subplot(313);
stem(k,abs(Uw));grid on
xlabel('k');ylabel('X(k)');title('FFT');

结果如下:关于矩形窗函数DFT和FFT的笔记_第6张图片
可能画成连续的更好看一些:关于矩形窗函数DFT和FFT的笔记_第7张图片
终于写完了,结果与想象中的差不多,但是这波长得也忒难看了,为此我增加了采样点数,这样就好看多了。
关于矩形窗函数DFT和FFT的笔记_第8张图片
4、顺便瞧一瞧脉宽对频谱的影响
a、采样点数N=256,脉宽为10,结果如下:
关于矩形窗函数DFT和FFT的笔记_第9张图片
b、脉宽为50,结果如下:
关于矩形窗函数DFT和FFT的笔记_第10张图片
c、脉宽为1,其实就成了冲激函数的DFT,结果如下:关于矩形窗函数DFT和FFT的笔记_第11张图片
可见,脉宽影响频谱能量的集中程度,脉宽越大,频谱越集中,极限是常函数的频谱,是在零点的一个冲激;脉宽越小,频谱越分散,极限是冲激函数的频谱,是一个白色频谱。
至此,理论与实际结果全部吻合,高兴高兴!

你可能感兴趣的:(MATLAB)