现代数字信号处理课后作业【第三章】及实践-DIT2-FFT编程&谱分析


Author: Peter
Date:2020-11-6
Location:FZU


文章目录

现代数字信号处理课后作业【第三章】

3-3 若周期实序列 x p ( n ) x_p(n) xp(n)是n的偶函数,则 X p ( k ) X_p(k) Xp(k)也是实序列且为 k k k的偶函数,试证明之。

解:依题目要求,即证明 X p ( k ) = X p ( − k ) = X p ∗ ( k ) X_p(k)=X_p(-k)=X_p^*(k) Xp(k)=Xp(k)=Xp(k)

  • 方法一:

   X p ( k ) = ∑ n = 0 N − 1 x p ( n ) W N k n X_p(k)=\sum\limits_{n=0}^{N-1}x_p(n)W_N^{kn} Xp(k)=n=0N1xp(n)WNkn

   X p ∗ ( k ) = ∑ n = 0 N − 1 [ x p ( n ) W N k n ] ∗ = ∑ n = 0 N − 1 x p ∗ ( n ) W N − k n X_p^*(k)=\sum\limits_{n=0}^{N-1}[x_p(n)W_N^{kn}]^*=\sum\limits_{n=0}^{N-1}x_p^*(n)W_N^{-kn} Xp(k)=n=0N1[xp(n)WNkn]=n=0N1xp(n)WNkn

x p ( n ) 是 实 序 列 , 所 以 x p ∗ ( n ) = x p ( n ) x_p(n)是实序列,所以x_p^*(n)=x_p(n) xp(n)xp(n)=xp(n)

   X p ∗ ( k ) = ∑ n = 0 N − 1 x p ( n ) W N − k n = X p ( − k ) X_p^*(k)=\sum\limits_{n=0}^{N-1}x_p(n)W_N^{-kn}=X_p(-k) Xp(k)=n=0N1xp(n)WNkn=Xp(k)

x p ( n ) 是 n 的 偶 函 数 , 所 以 x p ( n ) = x p ( − n ) x_p(n)是n的偶函数,所以x_p(n)=x_p(-n) xp(n)nxp(n)=xp(n)

   X p ( − k ) = ∑ n = 0 N − 1 x p ( n ) W N − k n = ∑ n = 0 N − 1 x p ( − n ) W N − k n = ∑ n = 1 − N 0 x p ( u ) W N k u X_p(-k)=\sum\limits_{n=0}^{N-1}x_p(n)W_N^{-kn}=\sum\limits_{n=0}^{N-1}x_p(-n)W_N^{-kn}=\sum\limits_{n=1-N}^{0}x_p(u)W_N^{ku} Xp(k)=n=0N1xp(n)WNkn=n=0N1xp(n)WNkn=n=1N0xp(u)WNku

            = ∑ n = 0 N − 1 x p ( u ) W N k u = X p ( k ) \ \ \ \ \ =\sum\limits_{n=0}^{N-1}x_p(u)W_N^{ku}=X_p(k)      =n=0N1xp(u)WNku=Xp(k)

   综 上 所 述 X p ( k ) = X p ( − k ) = X p ∗ ( k ) , 当 x p ( n ) 为 实 偶 函 数 时 , X p ( k ) 也 为 实 偶 函 数 综上所述X_p(k)=X_p(-k)=X_p^*(k),当x_p(n)为实偶函数时,X_p(k)也为实偶函数 Xp(k)=Xp(k)=Xp(k)xp(n)Xp(k)

注: 上式中 ∑ n = 1 − N 0 x p ( u ) W N k u = ∑ n = 0 N − 1 x p ( u ) W N k u 利 用 了 周 期 性 质 \sum\limits_{n=1-N}^{0}x_p(u)W_N^{ku}=\sum\limits_{n=0}^{N-1}x_p(u)W_N^{ku}利用了周期性质 n=1N0xp(u)WNku=n=0N1xp(u)WNku

在这里插入图片描述


  • 方法2:

   X p ( k ) = ∑ n = 0 N − 1 x p ( n ) e − j 2 π k n N = ∑ n = 0 N − 1 x p ( n ) [ c o s ( 2 π k n N ) − j s i n ( 2 π k n N ) ] X_p(k)=\sum\limits_{n=0}^{N-1}x_p(n)e^{-\dfrac{j2\pi kn}{N}}=\sum\limits_{n=0}^{N-1}x_p(n)[cos(\dfrac{2\pi kn}{N})-jsin(\dfrac{2\pi kn}{N})] Xp(k)=n=0N1xp(n)eNj2πkn=n=0N1xp(n)[cos(N2πkn)jsin(N2πkn)]

   因 为 x p ( n ) 是 偶 函 数 , 即 x ( n ) = x ( N − n ) , x ( n ) 关 于 n = N 2 偶 对 称 因为x_p(n)是偶函数,即x(n)=x(N-n),x(n)关于n=\dfrac{N}{2}偶对称 xp(n)x(n)=x(Nn)x(n)n=2N

   而 s i n ( 2 π k n N ) 关 于 n = N 2 奇 对 称 , 即 s i n ( π ) = 0 点 而sin(\dfrac{2\pi kn}{N})关于n=\dfrac{N}{2}奇对称,即sin(\pi)=0点 sin(N2πkn)n=2Nsin(π)=0

   因 此 X p ( k ) = ∑ n = 0 N − 1 x p ( n ) c o s ( 2 π k n N ) = X p ( − k ) = X p ∗ ( k ) 因此X_p(k)=\sum\limits_{n=0}^{N-1}x_p(n)cos(\dfrac{2\pi kn}{N})=X_p(-k)=X_p^*(k) Xp(k)=n=0N1xp(n)cos(N2πkn)=Xp(k)=Xp(k)

   综 上 所 述 X p ( k ) = X p ( − k ) = X p ∗ ( k ) , 当 x p ( n ) 为 实 偶 函 数 时 , X p ( k ) 也 为 实 偶 函 数 综上所述X_p(k)=X_p(-k)=X_p^*(k),当x_p(n)为实偶函数时,X_p(k)也为实偶函数 Xp(k)=Xp(k)=Xp(k)xp(n)Xp(k)

3-4 设 x ( n ) = { 1 0 ⩽ n ⩽ 3 0 其 它 x(n)=\begin{cases}1 & 0\leqslant n\leqslant 3 \\0 & 其它 \end{cases} x(n)={100n3   h ( n ) = { 1 4 ⩽ n ⩽ 6 0 其 它 h(n)=\begin{cases}1 & 4\leqslant n\leqslant 6 \\0 & 其它 \end{cases} h(n)={104n6 x p ( n ) = ∑ r = − ∞ + ∞ x ( n + 7 r ) \\x_p(n)=\sum\limits_{r=-∞}^{+∞}x(n+7r) xp(n)=r=+x(n+7r)   h p ( n ) = ∑ r = − ∞ + ∞ h ( n + 7 r ) h_p(n)=\sum\limits_{r=-∞}^{+∞}h(n+7r) hp(n)=r=+h(n+7r)
x p ( n ) x_p(n) xp(n) h p ( n ) h_p(n) hp(n)的周期卷积。

解: 两 个 序 列 周 期 相 等 , T = 7 , 且 大 于 x ( n ) 、 h ( n ) 长 度 两个序列周期相等,T=7,且大于x(n)、h(n)长度 T=7x(n)h(n)

   y p ( n ) = ∑ r = − ∞ + ∞ y ( n + 7 r ) y_p(n)=\sum\limits_{r=-∞}^{+∞}y(n+7r) yp(n)=r=+y(n+7r)

   y ( n ) = x ( n ) ∗ h ( n ) , 即 x p ( n ) 主 值 区 间 与 y p ( n ) 主 值 区 间 进 行 线 性 卷 积 y(n)=x(n)*h(n),即x_p(n)主值区间与y_p(n)主值区间进行线性卷积 y(n)=x(n)h(n)xp(n)yp(n)线

   其 中 x ( n ) = x p ( n ) G 7 ( n ) , h ( n ) = h p ( n ) G 7 ( n ) 其中x(n)=x_p(n)G_7(n),h(n)=h_p(n)G_7(n) x(n)=xp(n)G7(n)h(n)=hp(n)G7(n)

   根 据 不 进 位 乘 法 , 易 得 y ( n ) = { 0 , 0 , 0 , 0 , 1 , 2 , 3 , 3 , 2 , 1 , 0 , 0 , 0 } 根据不进位乘法,易得y(n)=\{0,0,0,0,1,2,3,3,2,1,0,0,0\} y(n)={0,0,0,0,1,2,3,3,2,1,0,0,0}:两个长度为7的序列线性卷积后,长度为7+7-1=13。

   y p ( n ) 为 y ( n ) 的 周 期 延 拓 , 如 下 图 所 示 y_p(n)为y(n)的周期延拓,如下图所示 yp(n)y(n)

图1

3-10 如果有限长序列, x ( n ) = G N ( n ) x(n)=G_N(n) x(n)=GN(n)
(1) 求 Z T [ x ( n ) ] ZT[x(n)] ZT[x(n)],并画出零极点图。
(2) 求频谱 X ( e j w ) X(e^{jw}) X(ejw),并画出幅度特性和相位特性。
(3)求 D F T [ x ( n ) ] DFT[x(n)] DFT[x(n)],并画出幅度特性和相位特性 。

解:

  • (1)
       x ( n ) = u ( n ) − u ( n − N ) x(n)=u(n)-u(n-N) x(n)=u(n)u(nN)

       Z T [ x ( n ) ] = ∑ n = − ∞ ∞ x ( n ) z − n = ∑ n = 0 N − 1 z − n = 1 − z − N 1 − z − 1 = 1 + z − 1 + z − 2 + . . . + z − ( N − 1 ) ZT[x(n)]=\sum\limits_{n=-∞}^{∞}x(n)z^{-n}=\sum\limits_{n=0}^{N-1}z^{-n}=\dfrac{1-z^{-N}}{1-z^{-1}}=1+z^{-1}+z^{-2}+...+z^{-(N-1)} ZT[x(n)]=n=x(n)zn=n=0N1zn=1z11zN=1+z1+z2+...+z(N1)

       由 1 − z − N = 0 推 出 z N = 1 由1-z^{-N}=0推出z^N=1 1zN=0zN=1

       z = e j 2 π k N , { k = 0 , 1 , . . . N − 1 } , 即 单 位 圆 上 的 N 等 分 点 z=e^{\frac{j2\pi k}{N}},\{k=0,1,...N-1\},即单位圆上的N等分点 z=eNj2πk{k=0,1,...N1}N

       由 于 k = 0 时 , z = e j 2 π k N = 1 , 分 子 分 母 零 极 对 消 由于k=0时,z=e^{\frac{j2\pi k}{N}}=1,分子分母零极对消 k=0z=eNj2πk=1,

       因 此 零 点 为 : z = e j 2 π k N , { k = 1 , . . . N − 1 } 因此零点为:z=e^{\frac{j2\pi k}{N}},\{k=1,...N-1\} z=eNj2πk{k=1,...N1}

       极 点 为 z = 0 ( N − 1 阶 极 点 ) 极点为z=0(N-1阶极点) z=0N1

   零极点图:

注: 如果有疑问为什么z=1即不是零点也不是极点,可参考频谱图-幅频特性 X ( e j w ) ∣ w = 0 X(e^{jw})\big|_{w=0} X(ejw)w=0时的幅值即不为零也不为无穷大。

在这里插入图片描述

  • (2)
       X ( e j w ) = X ( z ) ∣ z = e j w = e j w ( 1 − e − j w N ) e j w − 1 X(e^{jw})=X(z)\bigg|_{z=e^{jw}}=\dfrac{e^{jw}(1-e^{-jwN})}{e^{jw}-1} X(ejw)=X(z)z=ejw=ejw1ejw(1ejwN)

                       = s i n w N 2 s i n w 2 ⋅ e j w ( 1 − N ) 2 \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ =\dfrac{sin\dfrac{wN}{2}}{sin\dfrac{w}{2}}\cdot e^{\dfrac{jw(1-N)}{2}}                    =sin2wsin2wNe2jw(1N)

   ∣ X ( e j w ) ∣ = ∣ s i n w N 2 s i n w 2 ∣        其 中 ∣ X ( e j 0 ) ∣ = s a ( w N 2 ) s a ( w 2 ) ⋅ w N 2 w 2 ∣ w = 0 = N |X(e^{jw})|=\bigg|\dfrac{sin\dfrac{wN}{2}}{sin\dfrac{w}{2}}\bigg| \ \ \ \ \ \ 其中|X(e^{j0})|=\dfrac{sa(\dfrac{wN}{2})}{sa(\dfrac{w}{2})}\cdot \dfrac{\dfrac{wN}{2}}{\dfrac{w}{2}}\bigg|_{w=0}=N X(ejw)=sin2wsin2wN      X(ej0)=sa(2w)sa(2wN)2w2wNw=0=N

   ϕ ( w ) = w ( 1 − N ) 2     当 w = 2 k π N , ( k ≠ N 的 整 数 倍 时 ) X ( e j w ) = 0 , 此 时 ϕ ( w ) = 0 \phi(w)=\dfrac{w(1-N)}{2} \ \ \ 当w=\dfrac{2k\pi}{N},(k\neq N的整数倍时)X(e^{jw})=0,此时\phi(w)=0 ϕ(w)=2w(1N)   w=N2kπ(k=NX(ejw)=0ϕ(w)=0

   频谱图:

在这里插入图片描述

  • Matlab代码块:
B=[1,1,1,1,1,1,1,1];
A=1;
subplot(2,2,1);
zplane(B,A);title('N=8时零极点图');
[H,w]=freqz(B,A,'whole');
subplot(2,2,3);
plot(w/pi,abs(H));
xlabel('\omega/\pi');ylabel('|X(e^j^\omega)|');grid on;title('N=8时,幅频特性');
subplot(2,2,4);
plot(w/pi,angle(H),'-');
xlabel('\omega/\pi');ylabel('\phi(\omega)');grid on;axis([0,2,-5,5]);title('N=8时,相频特性');
  • (3)
       X ( k ) = ∑ n = 0 N − 1 x ( n ) e − j 2 π k n N , X ( 0 ) = ∑ n = 0 N − 1 x ( n ) = N X(k)=\sum\limits_{n=0}^{N-1}x(n)e^{-\frac{j2\pi kn}{N}},X(0)=\sum\limits_{n=0}^{N-1}x(n)=N X(k)=n=0N1x(n)eNj2πknX(0)=n=0N1x(n)=N

   当 k = 1 , 2 , . . . . N − 1 时     X ( k ) = D F T [ X ( n ) ] = X ( e j w ) ∣ w = 2 π k N = e j 2 π k N [ 1 − e − j 2 π k ] e j 2 π k N − 1       因 为 e − j 2 π k = 1 , 所 以 X ( k ) = 0        k = 1 , 2 , . . . N − 1 当k=1,2,....N-1时\ \ \ X(k)=DFT[X(n)]=X(e^{jw})\bigg|_{w=\frac{2 \pi k}{N}}=\dfrac{e^{\frac{j2\pi k}{N}}[1-e^{{-j2\pi k}}]}{e^{\frac{j2\pi k}{N}}-1} \\ \ \ \ \ \ 因为e^{-j2\pi k}=1,所以X(k)=0 \ \ \ \ \ \ k=1,2,...N-1 k=1,2,....N1   X(k)=DFT[X(n)]=X(ejw)w=N2πk=eNj2πk1eNj2πk[1ej2πk]     ej2πk=1X(k)=0      k=1,2,...N1

X ( k ) = { N k = 0 0 1 ⩽ k ⩽ N − 1 X(k)=\begin{cases}N & k=0 \\ 0&1\leqslant k\leqslant N-1 \end{cases} X(k)={N0k=01kN1

   频谱图:

在这里插入图片描述

  • Matlab代码块:
xn=[1,1,1,1,1,1,1,1];N=8;
Xk=fft(xn,N);
figure;
x_k=0:N-1;
subplot(2,2,1);stem(x_k,abs(Xk),'.');
axis([-1,9,0,9]);grid on;title('|X_8(k)|');
subplot(2,2,2);stem(x_k,angle(Xk),'.');
grid on;title('arg[X_8(k)]');

3-12 已知 x ( n ) x(n) x(n)是长为N的有限长序列并且 X ( k ) = D F T [ x ( n ) ] X(k)=DFT[x(n)] X(k)=DFT[x(n)]
y ( n ) = ∑ r = 0 N − 1 x ( n + r N ) y(n)=\sum\limits_{r=0}^{N-1}x(n+rN) y(n)=r=0N1x(n+rN),求 D F T [ y ( n ) ] DFT[y(n)] DFT[y(n)] X [ k ] X[k] X[k]之间关系。

解: X ( k ) = ∑ n = 0 N − 1 x ( n ) W N k n X(k)=\sum\limits_{n=0}^{N-1}x(n)W_N^{kn} X(k)=n=0N1x(n)WNkn

   y ( n ) 长 度 为 N 2 , 对 y ( n ) 进 行 N 2 点 D F T : y(n)长度为N^2,对y(n)进行N^2点DFT: y(n)N2y(n)N2DFT:

   D F T [ y ( n ) ] = ∑ n = 0 N − 1 ∑ r = 0 N − 1 x ( n + r N ) W N 2 k ( n + r N ) = ∑ r = 0 N − 1 [ ∑ n = 0 N − 1 x ( n ) e − j 2 π k n N 2 ] e − j 2 π k r N = ∑ r = 0 N − 1 [ ∑ n = 0 N − 1 x ( n ) W N k n N ] e − j 2 π k r N DFT[y(n)]=\sum\limits_{n=0}^{N-1}\sum\limits_{r=0}^{N-1}x(n+rN)W_{N^2}^{k(n+rN)}=\sum\limits_{r=0}^{N-1}\big[\sum\limits_{n=0}^{N-1}x(n)e^{\frac{-j2\pi kn}{N^2}}\big]e^{\frac{-j2\pi kr}{N}}=\sum\limits_{r=0}^{N-1}\big[\sum\limits_{n=0}^{N-1}x(n)W_N^{\frac{kn}{N}}\big]e^{\frac{-j2\pi kr}{N}} DFT[y(n)]=n=0N1r=0N1x(n+rN)WN2k(n+rN)=r=0N1[n=0N1x(n)eN2j2πkn]eNj2πkr=r=0N1[n=0N1x(n)WNNkn]eNj2πkr

                         = ∑ r = 0 N − 1 X ( k N ) e − j 2 π k r N \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ =\sum\limits_{r=0}^{N-1}X(\dfrac{k}{N})e^{\frac{-j2\pi kr}{N}}                      =r=0N1X(Nk)eNj2πkr

                         = X ( k N ) ∑ r = 0 N − 1 e − j 2 π k r N \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ =X(\dfrac{k}{N})\sum\limits_{r=0}^{N-1}e^{\frac{-j2\pi kr}{N}}                      =X(Nk)r=0N1eNj2πkr

D F T [ y ( n ) ] = X ( k N ) ∑ r = 0 N − 1 e − j 2 π k r N = { N ⋅ X ( k N ) k N 为 整 数 X ( k N ) ⋅ 1 − e − j 2 π k 1 − e − j 2 π k N = 0 k N 不 为 整 数 DFT[y(n)]=X(\dfrac{k}{N})\sum\limits_{r=0}^{N-1}e^{\frac{-j2\pi kr}{N}}=\begin{cases}N\cdot X(\dfrac{k}{N}) & \dfrac{k}{N}为整数 \\ \\X(\dfrac{k}{N})\cdot \dfrac{1-e^{-j2\pi k}}{1-e^{\frac{-j2\pi k}{N}}}=0& \dfrac{k}{N}不为整数\end{cases} DFT[y(n)]=X(Nk)r=0N1eNj2πkr=NX(Nk)X(Nk)1eNj2πk1ej2πk=0NkNk
  由此可见,截取长度 M M M等于 x p ( n ) x_p(n) xp(n)的整数个周期,即 M = m N M=mN M=mN,m为正整数时, X M ( k ) X_M(k) XM(k)也能表示 x p ( n ) x_p(n) xp(n)的频谱结构,此题 m = N , M = N 2 。 m=N,M=N^2。 m=NM=N2

4-3 某台计算机平均一次复乘需要100 u s us us,一次复加需要20 u s us us,今用来进行N=1024点DFT运算,问直接算法需要多少时间?时间抽奇偶分解FFT算法需要多少时间?

解: 直 接 法 : X ( k ) = D F T [ x ( n ) ] = ∑ n = 0 N − 1 x ( n ) W N k n 直接法:X(k)=DFT[x(n)]=\sum\limits_{n=0}^{N-1}x(n)W_N^{kn} X(k)=DFT[x(n)]=n=0N1x(n)WNkn

   从 上 式 可 以 看 出 每 计 算 X ( k ) 的 一 个 值 , 需 要 N 次 复 数 乘 法 和 ( N − 1 ) 复 数 加 法 从上式可以看出每计算X(k)的一个值,需要N次复数乘法和(N-1)复数加法 X(k)N(N1)

   所 以 T = N [ 100 N + 20 ( N − 1 ) ] , N = 1024 所以T=N[100N+20(N-1)],N=1024 T=N[100N+20(N1)]N=1024

   T 1 = 125.80864 s T_1=125.80864s T1=125.80864s

   采 用 时 间 抽 奇 偶 分 解 F F T 算 法 : 复 乘 次 数 为 N 2 l o g 2 N , 复 加 次 数 为 N l o g 2 N 采用时间抽奇偶分解FFT算法:复乘次数为\dfrac{N}{2}log_2N,复加次数为Nlog_2N FFT2Nlog2NNlog2N

   T 2 = 100 ⋅ N 2 l o g 2 N + 20 ⋅ N l o g 2 N = 0.7168 s T_2=100\cdot\dfrac{N}{2}log_2N+20\cdot Nlog_2N=0.7168s T2=1002Nlog2N+20Nlog2N=0.7168s

注: 时 域 基 2 F F T , N 点 F F T 可 以 分 为 M = l o g 2 N 级 , 每 级 有 N 2 个 蝶 形 时域基2FFT,N点FFT可以分为M=log_2N级,每级有\dfrac{N}{2}个蝶形 2FFTNFFTM=log2N2N

   一 个 蝶 形 需 要 1 次 复 乘 , 2 次 复 加 , 所 以 N 点 F F T 总 共 有 N 2 M 复 乘 , N 2 ⋅ 2 M 复 加 一个蝶形需要1次复乘,2次复加,所以N点FFT总共有\dfrac{N}{2}M复乘,\dfrac{N}{2}\cdot 2M复加 12NFFT2NM2N2M
在这里插入图片描述
在这里插入图片描述

实验题

1、写一个基2时抽FFT程序,不使用系统自带的fft函数(Matlab)

  • 编程思想:

在这里插入图片描述
 1.进行 N = 2 M N=2^M N=2M点FFT,若输入序列长度不足N,则尾部补0直到总长度为N。

 2.输入序列的索引先转成二进制再经过倒序后,序列按照新的索引值进行重新排列,matlab自带函数fliplr可实现该功能。

 3.总共分成 M = l o g 2 N M=log_2N M=log2N级进行蝶形运算, L = 1 , . . . M L=1,...M L=1,...M为当前级数, B = 2 L − 1 B=2^{L-1} B=2L1 为蝶形运算两个输入数据的距离即 X L ( k ) = X L − 1 ( k ) + X L − 1 ( k + B ) W N P X_L(k)=X_{L-1}(k)+X_{L-1}(k+B)W_N^P XL(k)=XL1(k)+XL1(k+B)WNP,每级含有 B = 2 L − 1 B=2^{L-1} B=2L1个旋转因子 W N P = W 2 L J , J = 0 , . . . B − 1 W_N^P=W_{2^L}^J,J=0,...B-1 WNP=W2LJJ=0,...B1
所以 P = J ⋅ 2 M − L P=J\cdot 2^{M-L} P=J2ML

 4.在当前级中寻找拥有相同旋转因子的蝶形进行运算,同一旋转因子对应着间隔为 2 L 2^L 2L点的 2 M − L 2^{M-L} 2ML个蝶形,由于每个蝶形的两个输入数据只对计算本蝶形有用,意味着计算完一个蝶形后所有数据可立即存入原输入数据所占用的存储单元。

 5.循环计算当前级下一个旋转因子蝶形运算,存入下一级,直到M级输出结果

  • 程序框图:

在这里插入图片描述

  • DIT2-FFT函数代码块:
%----------------函数调用方法:Myfft(xn,N)------------------
%----------------xn为要进行FFT计算的序列,N为FFT点数=2^n------------
function return_num=Myfft(xn,N)   

M=log2(N);          %计算级数
len=length(xn);     %序列xn的长度

if(len<N)
    xn=[xn,zeros(1,N-len)];  %如果xn序列长度不足N点FFT,则补零到长度为N
end

%--------------------倒序部分调用自带函数fliplr------------------------
binary_index=dec2bin((0:N-1),M);  %将输入的n=0,1,...N-1转换成二进制
reverse_binary_index=fliplr(binary_index);  %将二进制序列逆序
reverse_decimal_index=bin2dec(reverse_binary_index)+1; %逆序完将索引值转为十进制,记得加1,matlab数组索引从1开始到N结束
xn=xn(reverse_decimal_index);   %按照新的索引值重新排序,完成逆序输入

%--------------------分级进行蝶形运算---------------------------------
for L=1:M                               %DIT-FFT变换,M级蝶形变换
    B=2^(L-1);                          %两个输入数据相距B个点
    for J=0:B-1;                        %旋转因子处理
        P=2^(M-L)*J;                    %旋转因子上标
        W=exp(-1i*2*pi*P/N);            %对应旋转因子
        for k=(J+1):2^L:N;              %每级相同旋转因子间隔,数组索引从1开始到N结束,每次循环间隔2^L点          
            T=xn(k)+xn(k+B)*W;          %进行蝶形运算,先暂存,此时的xn(k)还要参与下一个xn(k+B)计算,不能更新存储值
            xn(k+B)=xn(k)-xn(k+B)*W;    %等相减部分计算完存储后
            xn(k)=T;                    %再存回
        end
    end
end
return_num=xn;
  • 倒序编程思想:

在这里插入图片描述

 1.从二进制倒序表可以看出规律,顺序数I加1,是在二进制数最低位加1,逢2向高位进位。而倒序数J则是在M位二进制数最高位加1,逢2向次高位(低位)进位。故可以从任一倒序值求得下一个倒序值。

 2.用order_i表示当前顺序数十进制值,back_j表示当前倒序数十进制值, N = 2 M N=2^M N=2M,M位二进制数最高位的十进制权值为 N 2 \frac{N}{2} 2N,且从左向右二进制位的权值依次为 N 4 , N 8 . . . \frac{N}{4},\frac{N}{8}... 4N8N...。因此最高位加1相当于十进制运算back_j+ N 2 \frac{N}{2} 2N,如果最高位为0,即back_j< N 2 \frac{N}{2} 2N,则直接由back_j+ N 2 \frac{N}{2} 2N出下一个倒序值。如果最高位为1,即back_j ⩽ N 2 \leqslant \frac{N}{2} 2N,则先将最高位变成0,即back_j=back_j- N 2 \frac{N}{2} 2N,然后次高位加1:back_j+ N 4 \frac{N}{4} 4N,但次高位加1时还需和次高位权值 N 4 \frac{N}{4} 4N进行比较,循环判断,直到完成二进制最高位加1,逢2向右进位的运算。

在这里插入图片描述

 3.形成倒序数back_j后,将原数组 x ( n ) x(n) x(n)中存放的输入序列重新按倒序排列,假设N=8时,输入序列是 x ( 0 ) , x ( 1 ) , x ( 2 ) , . . . . x ( 7 ) x(0),x(1),x(2),....x(7) x(0),x(1),x(2),....x(7),由上图可知,倒序后第一个序列值 x ( 0 ) x(0) x(0) x ( N − 1 ) x(N-1) x(N1)不需要重排,所以顺序数order_i初值为1,终值为N-2,倒序数back_j初值为 N 2 \frac{N}{2} 2N。每计算出一个倒序值back_j,便与循环语句自动生成的顺序order_i比较,当order_i=back_j时,不需要交换,当二者不等时交换,为了避免重复调换只对order_i<back_j进行交换。

  • 倒序程序框图:

在这里插入图片描述

  • 含具体倒序方法的DIT2-FFT函数代码:
%----------------函数调用方法:Myfft2(xn,N)------------------
%----------------xn为要进行FFT计算的序列,N为FFT点数=2^n------------
function return_num=Myfft2(xn,N)

M=log2(N);          %计算级数
len=length(xn);     

if(len<N)
    xn=[xn,zeros(1,N-len)];  %如果xn序列长度不足N点FFT,则补零到长度为N
end

%------------------------自己编写的倒序法------------------------
back_j=N/2;                        %back_j为倒序初始值N/2,注意由于matlab数组索引从1开始到N结束,故xn(back_j+1)xn(order_i+1)
for order_i=1:N-2                  %order_i为顺序计数,由于x(0)x(N-1)不需要重排,故从x(1)x(N-2)进行倒序
    if order_i<back_j              %如果顺序数小于倒序数则进行交换,二者相等时不用交换
        temp=xn(back_j+1);
        xn(back_j+1)=xn(order_i+1);
        xn(order_i+1)=temp;
    end                             
                                    %用当前倒序值计算下一个倒序值
    high_bit=N/2;                   %二进制最高位十进制权值为N/2
    while back_j>=high_bit          %当前倒序值如果大于最高位值
        back_j=back_j-high_bit;     %则要去掉最高位,判断次高位
        high_bit=high_bit/2;        %二进制次高位十进制权值为N/2/2,依次类推每到下一位权值为上一位权值一半
    end
    back_j=back_j+high_bit;         %直到"无进位时",二进制最高位加1,完成下一位倒序计算
end

%--------------------分级进行蝶形运算---------------------------------
for L=1:M                               %DIT-FFT变换,M级蝶形变换
    B=2^(L-1);                          %两个输入数据相距B个点
    for J = 0:B-1;                      %旋转因子处理
        P=2^(M-L)*J;
        W=exp(-1i*2*pi*P/N);            %对应旋转因子
        for k=(J+1):2^L:N;              %每级相同旋转因子间隔,数组索引从1开始到N结束,每次循环间隔2^L点           
            T=xn(k)+xn(k+B)*W;          %进行蝶形运算,先暂存,此时的xn(k)还要参与下一个xn(k+B)计算,不能更新存储值
            xn(k+B)=xn(k)-xn(k+B)*W;    %等相减部分计算完存储后
            xn(k)=T;                    %再存回
        end
    end
end
return_num=xn;
  • 测试代码块:
xn=[1 2 3 4 5 6 9 10];      %要转换的序列
N=32;                        %FFT点数 N=2^n
system_fft=fft(xn,N);       %matlab内置fft变换,用于对比
n=0:N-1;                    %x轴索引
subplot(3,1,1);stem(n,abs(system_fft),'r.');title(['系统自带函数',num2str(N),'点FFT']);
grid on; %添加网格
My_fft=Myfft(xn,N);           
subplot(3,1,2);stem(n,abs(My_fft),'.') ;title(['自己编写函数',num2str(N),'点FFT'])          
grid on; %添加网格
My_fft2=Myfft2(xn,N);
subplot(3,1,3);stem(n,abs(My_fft2),'.') ;title(['自己编写倒序函数',num2str(N),'点FFT'])          
grid on; %添加网格
  • 运行效果:

在这里插入图片描述

2、研究如何利用FFT程序分析确定性时间连续信号,设输入信号为 x ( t ) = c o s ( 2 π F t ) x(t)=cos(2\pi Ft) x(t)=cos(2πFt)
①F=50,N=32,T=0.000625
②F=50,N=32,T=0.005
③F=50,N=32,T=0.0046875
④F=50,N=32,T=0.004
⑤F=50,N=64,T=0.000625

  • Matlab代码块:
F=50;		%输入信号频率
N=32;		%N点FFT
T=[0.000625,0.005,0.0046875,0.004];		%抽样间隔
n=0:63;%对连续时间信号x(t)采样64个点   %采样点数应足够大
figure('name','谱分析');
for i=1:5
        if i<5
            T1=T(i); 
        else 
            T1=T(1);
            N=64;
        end
        xn=cos(2*pi*F*n*T1);%x(t)抽样成离散x(nT)
        Xk=Myfft2(xn,N);%对抽样得到的xn进行FFT变换,此处采用自己编写的FFT函数,可换成系统自带函数Xk=fft(xn,N);
        abs_Xk=abs(Xk);  %取模值
        xlabel_f=(0:N-1)/(N*T1);%谱分析的横轴坐标为f/Hz   谱分辨率=1/(N*T1)
        subplot(3,2,i);
        stem(xlabel_f(1:N/2),abs_Xk(1:N/2),'.');  %由于实序列的dft共轭对称,即模值关于k=N/2偶对称,所以只需查看前N/2个点即可  
        xlabel('频率/Hz');ylabel('振幅');grid on;title(['F=50','  ','N=',num2str(N),'  ','T=',num2str(T1)]);
end
  • 实验效果:

在这里插入图片描述

  • 总结:

 由于输入信号频率为 50 H z 50Hz 50Hz,5种条件下的抽样频率分别为 1600 H z , 200 H z , 213.33 H z , 250 H z , 1600 H z 1600Hz,200Hz,213.33Hz,250Hz,1600Hz 1600Hz200Hz213.33Hz250Hz1600Hz都满足奈奎斯特抽样速率,避免了频谱混叠。
 ①FFT点数N=32,抽样频率1600Hz,谱分辨率50Hz
 ②FFT点数N=32,抽样频率200Hz,谱分辨率6.25Hz
 ③FFT点数N=32,抽样频率213.33Hz,谱分辨率6.67Hz
 ④FFT点数N=32,抽样频率250Hz,谱分辨率7.81Hz
 ⑤FFT点数N=64,抽样频率1600Hz,谱分辨率25Hz
 从以上数据和实验图可以看出,当输入信号频率能被谱分辨率整除时,频谱图中的峰值处的频率便是输入的连续时间信号的频率。另从④③②三组数据可看出,当N为固定值时,降低采样频率可以提高谱分辨率(谱分辨率值越小说明分辨能力越强)。

  • 33
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 24
    评论
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值