快速傅里叶变换(FFT)

实验目的

本实验结合理论教材中有关快速傅里叶变换(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

输出各存储单元的数据:

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值