实验目的
本实验结合理论教材中有关快速傅里叶变换(FFT)的教学内容,学习和掌握按时间抽取的基-2FFT算法原理和实现方法。
所使用的主要函数
x=fft(x,N);采用FFT算法计算序列向量x的N点DFT变换,当N缺省时,fft函数自动按x的长度计算DIT。当N为2的整数次幂时,fft按基-2算法计算,否则用混合算法。
x=ifft(N,N);采用FFT算法计算序列向量X的N点IDFT变换。
相关函数的应用实例
function Xk= ditfft(xn)
M=nextpow2(length(xn));
N=2^M;
for m=0:N/2-1
WN(m+1)=exp(-j*2*pi/N)^m;
end
A=[xn,zeros(1,N-length(xn))];
disp('输入到各存储单元的数据:');disp(A);
J=0;
for I=0:N-1
if I<J
T=A(I+1);
A(I+1)=A(J+1);
A(J+1)=T;
end
K= N/2;
while J>=K
J=J-K;
K= K/2;
end
J=J+K;
end
disp('倒序后各个存储单元的数据:');disp(A);
for L=1:M;
disp('运算级次:');
disp(L) ;
B=2^(L- 1);
for R=0:B- 1
P=2^(M-L) * R;
for K=R:2^L:N-2
T=A(K+1)+A(K+B+1)* WN(P+1);
A(K+B+1)=A(K+1)-A(K+B+1)*WN(P+1);
A(K+1)=T;
end
end
disp('本级运算后各存储单元的数据:');disp(A);
end
disp('输出各存储单元的数据:');Xk=A
实验内容
1.已知序列x(n)={2,1,3,9,0,5,7,8}, 模仿例题编程实现DIT-FFT功能计算X(k), 并与直接调用函数fft()命令对比计算结果是否正确。
2.X(k)={36.0000,-4.0000+9.6569i,-4.0000+4.0000i,-4.0000+1.6569i,-4.0000,-4.0000-0.6569i,-4.0000-4.0000i,-4.0000-9.6569i }, 已知序列x(n)的DFT为X(k),模仿例题编程实现IFFT功能计算x(n), 并与直接调用函数 ifft()命令对比计算结果是否正确。
实验代码
function Xk= ditfft(xn)
M=nextpow2(length(xn));%M为指数
N=2^M;%xn的长度为N
for m=0:N/2-1%蝶形因子的指数范围
WN(m+1)=exp(-j*2*pi/N)^m;%计算蝶形因子
end
A=[xn,zeros(1,N-length(xn))];%数据输入
disp('输入到各存储单元的数据:');
disp(A);
%倒序
J=0;%给倒序赋初始值
for I=0:N-1%按序交换数据和算倒序数
if I<J%条件判断及数据交换
T=A(I+1);
A(I+1)=A(J+1);
A(J+1)=T;
end
K= N/2;
while J>=K
J=J-K;
K= K/2;
end
J=J+K;
end
disp('倒序后各个存储单元的数据:');
disp(A);
%
for L=1:M;
disp('运算级次:');
disp(L) ;
B=2^(L- 1);
for R=0:B- 1
P=2^(M-L) * R;
for K=R:2^L:N-2
T=A(K+1)+A(K+B+1)* WN(P+1);
A(K+B+1)=A(K+1)-A(K+B+1)*WN(P+1);
A(K+1)=T;
end
end
disp('本级运算后各存储单元的数据:');disp(A);
end
disp('输出各存储单元的数据:');
Xk=A;
1.
clc;clear;close all;
xn=[2,1,3,9,0,5,7,8];
N = length(xn);
xk1=ditfft(xn);
xk2=fft(xn);
figure(1);
subplot(2,1,1); stem(0:N-1,real(xk1),'fill','linewidth',1.0);
xlabel('\itn'); ylabel('Amplitude'); title(' xk1实部');
subplot(2,1,2); stem(0:N-1,real(xk2),'fill','linewidth',1.0);
xlabel('\itn'); ylabel('Amplitude'); title(' xk2实部');
结果:
输入到各存储单元的数据:
2 1 3 9 0 5 7 8
倒序后各个存储单元的数据:
2 0 3 7 1 5 9 8
运算级次:
1
本级运算后各存储单元的数据:
2 2 10 -4 6 -4 17 1
运算级次:
2
本级运算后各存储单元的数据:
12.0000 + 0.0000i 2.0000 + 4.0000i -8.0000 + 0.0000i 2.0000 - 4.0000i 23.0000 + 0.0000i -4.0000 - 1.0000i -11.0000 + 0.0000i -4.0000 + 1.0000i
运算级次:
3
本级运算后各存储单元的数据:
35.0000 + 0.0000i -1.5355 + 6.1213i -8.0000 +11.0000i 5.5355 - 1.8787i -11.0000 + 0.0000i 5.5355 + 1.8787i -8.0000 -11.0000i -1.5355 - 6.1213i
输出各存储单元的数据:
clc;clear;close all;
Xk=[36.0000,-4.0000+9.6569i,-4.0000+4.0000i,-4.0000+1.6569i,-4.0000,-4.0000-0.6569i,-4.0000-4.0000i,-4.0000-9.6569i];
N = length(Xk);
% 直接调用ifft函数计算Xk的离散傅里叶反变换
xn1 = ifft(Xk);
% 利用fft函数和ditfft函数计算Xk的离散傅里叶反变换
Xk_conj = conj(Xk);
xn2 = conj(fft(Xk_conj))/N;
xn3 = conj(ditfft(Xk_conj))/N;
figure(1);
subplot(3,2,1); stem(0:N-1,real(xn1),'fill','linewidth',1.0);
xlabel('\itn'); ylabel('Amplitude'); title(' xn1实部');
subplot(3,2,2); stem(0:N-1,imag(xn1),'fill','linewidth',1.0);
xlabel('\itn'); ylabel('Amplitude'); title(' xn1虚部');
subplot(3,2,3); stem(0:N-1,real(xn2),'fill','linewidth',1.0);
xlabel('\itn'); ylabel('Amplitude'); title(' xn2实部');
subplot(3,2,4); stem(0:N-1,imag(xn2),'fill','linewidth',1.0);
xlabel('\itn'); ylabel('Amplitude'); title(' xn2虚部');
subplot(3,2,5); stem(0:N-1,real(xn3),'fill','linewidth',1.0);
xlabel('\itn'); ylabel('Amplitude'); title(' xn3实部');
subplot(3,2,6); stem(0:N-1,imag(xn3),'fill','linewidth',1.0);
xlabel('\itn'); ylabel('Amplitude'); title(' xn3虚部');
结果:
输入到各存储单元的数据:
36.0000 + 0.0000i -4.0000 - 9.6569i -4.0000 - 4.0000i -4.0000 - 1.6569i -4.0000 + 0.0000i -4.0000 + 0.6569i -4.0000 + 4.0000i -4.0000 + 9.6569i
倒序后各个存储单元的数据:
36.0000 + 0.0000i -4.0000 + 0.0000i -4.0000 - 4.0000i -4.0000 + 4.0000i -4.0000 - 9.6569i -4.0000 + 0.6569i -4.0000 - 1.6569i -4.0000 + 9.6569i
运算级次:
1
本级运算后各存储单元的数据:
32.0000 + 0.0000i 40.0000 + 0.0000i -8.0000 + 0.0000i 0.0000 - 8.0000i -8.0000 - 9.0000i 0.0000 -10.3138i -8.0000 + 8.0000i 0.0000 -11.3138i
运算级次:
2
本级运算后各存储单元的数据:
24.0000 + 0.0000i 32.0000 - 0.0000i 40.0000 + 0.0000i 48.0000 + 0.0000i -16.0000 - 1.0000i -11.3138 -10.3138i 0.0000 -17.0000i 11.3138 -10.3138i
运算级次:
3
本级运算后各存储单元的数据:
8.0000 - 1.0000i 16.7070 + 0.7071i 23.0000 - 0.0000i 32.7070 - 0.7071i 40.0000 + 1.0000i 47.2930 - 0.7071i 57.0000 + 0.0000i 63.2930 + 0.7071i
输出各存储单元的数据: