华南理工大学数字信号处理实验二代码

实验报告
实验二
课程名称:《数字信号处理实验》

验证性实验

实验目的

  • 研究和验证不同频率成分的信号叠加及其频谱特性

  • 验证指数序列的离散傅里叶变换(DFT)和其逆变换(IDFT)的效果

  • 验证离散傅里叶变换(DFT)的对称性和共轭对称性 [@ning2012]

实验原理

信号的频率分解

信号 x [ n ] x[n] x[n] 可以表示为不同频率正弦波的叠加:
x [ n ] = ∑ k = 0 N − 1 A k cos ⁡ ( 2 π f k n T + ϕ k ) x[n] = \sum_{k=0}^{N-1} A_k \cos(2\pi f_k nT + \phi_k) x[n]=k=0N1Akcos(2πfknT+ϕk)

其中, A k A_k Ak f k f_k fk,和 ϕ k \phi_k ϕk 分别是第 k k k
个正弦波的幅度、频率和相位, T T T 是采样周期, n n n 是时域的采样点索引。

离散傅里叶变换(DFT)

离散傅里叶变换提供了一种方法,可以将时域的离散信号转换为频域的表示。DFT定义为:
X [ k ] = ∑ n = 0 N − 1 x [ n ] ⋅ e − j 2 π N k n X[k] = \sum_{n=0}^{N-1} x[n] \cdot e^{-j\frac{2\pi}{N}kn} X[k]=n=0N1x[n]ejN2πkn

其中, X [ k ] X[k] X[k] 是在频率索引 k k k 处的复数形式的频域表示,展示了频率
k N T \frac{k}{NT} NTk 处的幅度和相位信息。

对于基本的指数序列,其DFT可以直接计算为:
X [ k ] = ∑ n = 0 N − 1 x [ n ] ⋅ e − j 2 π N k n X[k] = \sum_{n=0}^{N-1} x[n] \cdot e^{-j\frac{2\pi}{N}kn} X[k]=n=0N1x[n]ejN2πkn

这一公式揭示了序列在离散频率点 k k k
的复振幅,其中包含了幅度和相位信息。对于纯指数信号,DFT结果在特定 k k k
值处会显示为尖峰,此 k k k 值对应于指数序列的频率 ω 0 \omega_0 ω0

频谱分析和频率成分的可视化

通过计算 X [ k ] X[k] X[k] 的幅度和相位,我们可以获得信号的频谱图。幅度谱 ∣ X [ k ] ∣ |X[k]| X[k]
和相位谱 ∠ X [ k ] \angle X[k] X[k] 分别提供了不同频率成分的强度和相位偏移信息:
∣ X [ k ] ∣ = Re ( X [ k ] ) 2 + Im ( X [ k ] ) 2 |X[k]| = \sqrt{\text{Re}(X[k])^2 + \text{Im}(X[k])^2} X[k]=Re(X[k])2+Im(X[k])2

∠ X [ k ] = arctan ⁡ ( Im ( X [ k ] ) Re ( X [ k ] ) ) \angle X[k] = \arctan\left(\frac{\text{Im}(X[k])}{\text{Re}(X[k])}\right) X[k]=arctan(Re(X[k])Im(X[k]))

信号重构

利用逆离散傅里叶变换(IDFT),可以从频域数据 X [ k ] X[k] X[k] 重构原始时域信号
x [ n ] x[n] x[n]
x [ n ] = 1 N ∑ k = 0 N − 1 X [ k ] ⋅ e j 2 π N k n x[n] = \frac{1}{N} \sum_{k=0}^{N-1} X[k] \cdot e^{j\frac{2\pi}{N}kn} x[n]=N1k=0N1X[k]ejN2πkn

这一过程表明,通过适当处理其频域表示,原始信号可以完整地恢复,证明了频率成分分析的准确性和有效性。

IDFT的应用

逆离散傅里叶变换(IDFT)是DFT的逆过程,用于从频域信号恢复时域信号:
x [ n ] = 1 N ∑ k = 0 N − 1 X [ k ] ⋅ e j 2 π N k n x[n] = \frac{1}{N} \sum_{k=0}^{N-1} X[k] \cdot e^{j\frac{2\pi}{N}kn} x[n]=N1k=0N1X[k]ejN2πkn
通过IDFT,可以验证DFT的准确性。如果从DFT到IDFT的转换能完美地重构原始信号
x [ n ] x[n] x[n],则证明了变换过程的正确性和信号处理方法的有效性。

指数序列和其变换

指数序列一般形式为 x [ n ] = A e j ( ω 0 n + ϕ ) x[n] = A e^{j(\omega_0 n + \phi)} x[n]=Aej(ω0n+ϕ),其中
A A A ω 0 \omega_0 ω0 ϕ \phi ϕ
分别代表幅度、基本角频率和相位。此类序列在进行离散傅里叶变换时,显示为频谱中的尖峰,这一特性使其在频域分析中尤为重要。

离散傅里叶变换(DFT)的对称性和共轭对称性

  • 对称性

    在DFT中,如果输入信号是实数(即 x [ n ] x[n] x[n]
    没有虚部),那么其频谱将展示对称性。具体来说,对于 N N N 点DFT,有:
    X [ k ] = X [ N − k ] ∗ X[k] = X[N-k]^* X[k]=X[Nk] 这意味着频谱的第 k k k 项和第 N − k N-k Nk
    项是共轭对称的,即它们的幅度相等,相位相反。

  • 共轭对称性

    如果输入信号是纯实数的偶函数(即
    x [ n ] = x [ N − n ] x[n] = x[N-n] x[n]=x[Nn]),其DFT结果也将是实数且偶对称。类似地,如果输入信号是纯实数的奇函数(即
    x [ n ] = − x [ N − n ] x[n] = -x[N-n] x[n]=x[Nn]),其DFT结果将是纯虚数且奇对称。

  • 数学描述和公式

    对于一个一般的复数信号,DFT定义为:
    X [ k ] = ∑ n = 0 N − 1 x [ n ] ⋅ e − j 2 π N k n X[k] = \sum_{n=0}^{N-1} x[n] \cdot e^{-j\frac{2\pi}{N}kn} X[k]=n=0N1x[n]ejN2πkn

    通过这一定义,我们可以展开并验证信号的共轭对称性。对于实数信号,我们有:
    X [ k ] = ∑ n = 0 N − 1 x [ n ] ⋅ cos ⁡ ( 2 π k n N ) − j ∑ n = 0 N − 1 x [ n ] ⋅ sin ⁡ ( 2 π k n N ) X[k] = \sum_{n=0}^{N-1} x[n] \cdot \cos\left(\frac{2\pi kn}{N}\right) - j\sum_{n=0}^{N-1} x[n] \cdot \sin\left(\frac{2\pi kn}{N}\right) X[k]=n=0N1x[n]cos(N2πkn)jn=0N1x[n]sin(N2πkn)

    其中实部和虚部的对称性可以独立检验。

通过验证DFT的对称性和共轭对称性,不仅加强了对信号频谱结构的理解,还为信号分析提供了重要的数学工具。这些性质在减少计算量、提高算法效率以及实际信号处理系统的设计中发挥着关键作用,尤其是在音频和通信领域中。

实验内容

  • 1. 2N点实数序列 x ( n ) = { cos ⁡ ( 2 π ⋅ 7 n N ) + 1 2 cos ⁡ ( 2 π ⋅ 19 n N ) , n = 0 , 1 , 2 , … , 2 N − 1 ; 0 , 其他 n ; x(n) = \begin{cases} \cos\left(\frac{2\pi \cdot 7n}{N}\right) + \frac{1}{2} \cos\left(\frac{2\pi \cdot 19n}{N}\right), & n = 0,1,2,\ldots,2N-1; \\ 0, & \text{其他} n; \end{cases} x(n)={cos(N2π7n)+21cos(N2π19n),0,n=0,1,2,,2N1;其他n; N=64。用一个64点的复数FFT
    程序,一次算出, X ( k ) = DFT [ x ( n ) ] 2 N X(k) = \text{DFT}[x(n)]_{2N} X(k)=DFT[x(n)]2N并绘出 ∣ X ( k ) ∣ |X(k)| X(k)的图形。

  • 2. 已知指数序列在单位圆上的 N = 64 N=64 N=64 点分布的 Z Z Z 变换为:
    X ( Z k ) = X ( k ) = 1 1 − 0.8 e − j 2 π k / N , k = 0 , 1 , 2 , … , 63 X(Z_k) = X(k) = \frac{1}{1 - 0.8e^{-j2\pi k/N}}, \quad k = 0,1,2,\ldots,63 X(Zk)=X(k)=10.8ej2πk/N1,k=0,1,2,,63
    N N N 点 IFFT 程序计算出 x ˉ ( n ) = IDFT [ X ( k ) ] \bar{x}(n) = \text{IDFT}[X(k)] xˉ(n)=IDFT[X(k)]
    x ˉ ( n ) \bar{x}(n) xˉ(n)

  • 3.
    使用Matlab编程验证DFT操作的对称性。设计您自己的N点复序列,并通过编程验证表5.1中的对称性属性。

    在这里插入图片描述

实验一

  • 首先,定义了一个序列的长度 N N N 为 64,然后创建了一个时间索引
    n n n,范围从 0 到 2 N − 1 2N-1 2N1

  • 接下来,定义了一个信号
    x x x,它是两个正弦信号的叠加,分别以不同的频率振荡。第一个正弦信号的频率为
    7 Hz,第二个正弦信号的频率为 19 Hz。

  • 使用快速傅里叶变换(FFT)计算了信号 x x x 的频谱,得到了频谱 X X X

  • 计算了频谱的幅度 ∣ X ( k ) ∣ |X(k)| X(k),即频谱的绝对值。

  • 最后,绘制了频谱幅度 ∣ X ( k ) ∣ |X(k)| X(k) 的图形,使用了 stem
    函数来绘制离散点图。横坐标表示频率索引
    k k k,纵坐标表示幅度,同时添加了标签和标题以及网格线。

<!-- -->
N = 64; % 序列长度
n = 0:2*N-1; % 时间索引 n

% 定义信号 x(n)
x = cos(2*pi*7*n/N) + 1/2*cos(2*pi*19*n/N);

% 计算信号的快速傅里叶变换(FFT)
X = fft(x, 2*N);

% 计算幅度 |X(k)|
magnitude_X = abs(X);

% 绘制 |X(k)| 的图形
k = 0:2*N-1; % 频率索引 k
stem(k, magnitude_X); % 使用 stem 函数来绘制离散点
xlabel('k');
ylabel('|X(k)|');
title('Magnitude of DFT of x(n)');
grid on;

可以得到以下实验结果:

在这里插入图片描述

实验二

  • 定义了一个序列的点数为 N = 64 N = 64 N=64,并创建了一个点的索引 k k k,范围从 0
    N − 1 N-1 N1

  • 计算了序列 X ( k ) X(k) X(k) 在单位圆上的 64 个点。这里使用了一个公式来计算
    X ( k ) X(k) X(k),公式为 X ( k ) = 1 1 − 0.8 ⋅ e − j 2 π k / N X(k) = \frac{1}{1 - 0.8 \cdot e^{-j2\pi k/N}} X(k)=10.8ej2πk/N1,其中
    j j j 是虚数单位。

  • 通过使用逆离散傅里叶变换(IFFT),计算了序列 x ( n ) x(n) x(n)。在 MATLAB
    中,可以使用 ifft 函数来执行逆离散傅里叶变换。

  • 由于原始序列是复数,但实际应用中通常处理实数序列,因此将计算得到的序列取了实部。

  • 显示了计算得到的序列 x ( n ) x(n) x(n)

  • 使用了 stem 函数绘制了序列 x ( n ) x(n) x(n) 的图形,横坐标表示序列索引
    n n n,纵坐标表示序列值 x ( n ) x(n) x(n),并添加了标签和标题。

<!-- -->
N = 64; % 序列的点数
k = 0:N-1; % 点的索引

% 计算序列X(k)在单位圆上的64点
X_k = 1 ./ (1 - 0.8 .* exp(-1j * 2 * pi * k / N));

% 计算x(n)通过使用IFFT
x_n = ifft(X_k);

% 因为原始序列是实数,取实部
x_n = real(x_n);

% 显示序列
disp(x_n);

% 可视化序列
stem(0:N-1, x_n);
xlabel('n');
ylabel('x(n)');
title('Sequence x(n) from IFFT');

可以得到以下的实验结果:
在这里插入图片描述

实验三

以下代码实现了对给定复数序列的各种对称性分析,并对其进行了离散傅里叶变换(DFT),然后绘制了不同情况下的DFT结果。

下面是关于这段代码的说明:

  • 定义了一个包含复数元素的序列 x x x,这个序列有四个元素。

  • 计算了序列的长度 N N N,并创建了一个序列的索引 n n n,范围从 0 到
    N − 1 N-1 N1

  • 分别提取了序列 x x x 的实部、虚部和共轭部分,并构造了 x x x 的倒序序列
    x r xr xr 和其共轭序列 x c c x_cc xcc

  • 计算了序列 x x x 的共轭序列 x c c x_cc xcc x x x 的共轭序列 x c c x_cc xcc
    在频域的DFT。

  • 计算了 x x x 的实部序列 x r e x_re xre x x x 的虚部序列 x i m x_im xim 在频域的DFT。

  • 计算了 x x x 的共轭序列 x c c x_cc xcc x x x 的平均序列 x c s x_cs xcs 在频域的DFT。

  • 计算了 x x x 的共轭序列 x c c x_cc xcc x x x 的差分序列 x c a x_ca xca 在频域的DFT。

  • 使用 stem 函数绘制了不同情况下的DFT结果的实部和虚部,分别包括 x x x
    的共轭序列、实部、虚部、共轭序列的DFT结果,以及共轭序列和实部序列的平均、差分序列的DFT结果。

  • 每个图形都包括了四个子图,分别展示了实部和虚部的DFT结果。

<!-- -->
function varargout=symmetry()
x=[1+1j*4, -1+1j*3, 4-1j*2, -5-1j*6];
N=length(x);
n=0:N-1;
x_re=real(x);
x_im=imag(x);
x_conj=conj(x);
xr=x(mod(-n,N)+1);
x_cc=conj(xr);
% x_cc=[1-1j*4, -5+1j*6, 4+1j*2, -2-1j*3];
% x_cs=[1, -3.5+1j*4.5, 4, -3.5-1j*4.5];
% x_ca=[1j*4, 1.5-1j*1.5,-1j*2,-1.5-1j*1.5];
x_cs=0.5*(x+x_cc);
x_ca=0.5*(x-x_cc);

k=0:N-1;
Xk=fft(x);
Xkr=Xk(mod(-k,N)+1);
Xk_cc=conj(Xkr);
Xk_conj=conj(Xk);
Xk_re=real(Xk);
Xk_im=imag(Xk);
Xk_cs=0.5*(Xk+Xk_cc);
Xk_ca=0.5*(Xk-Xk_cc);

X1=fft(x_conj);
X2=fft(x_cc);
X3=fft(x_re);
X4=fft(1j.*x_im);
X5=fft(x_cs);
X6=fft(x_ca);

figure
subplot(2,2,1)
stem(k,real(X1))
title('real part of DFT[x*[n]]')
subplot(2,2,2)
stem(k,imag(X1))
title('imag part of DFT[x*[n]]')
subplot(2,2,3)
stem(k,real(Xk_cc))
title('real part of X*[<-k>N]')
subplot(2,2,4)
stem(k,imag(Xk_cc))
title('imag part of X*[<-k>N]')

figure
subplot(2,2,1)
stem(k,real(X2))
title('real part of DFT[x*[<-n>N]]')
subplot(2,2,2)
stem(k,imag(X2))
title('imag part of DFT[x*[<-n>N]]')
subplot(2,2,3)
stem(k,real(Xk_conj))
title('real part of X*[k]')
subplot(2,2,4)
stem(k,imag(Xk_conj))
title('imag part of X*[k]')

figure
subplot(2,2,1)
stem(k,real(X3))
title('real part of DFT[xre[n]]')
subplot(2,2,2)
stem(k,imag(X3))
title('imag part of DFT[xre[n]]')
subplot(2,2,3)
stem(k,real(Xk_cs))
title('real part of Xcs[k]')
subplot(2,2,4)
stem(k,imag(Xk_cs))
title('imag part of Xcs[k]')

figure
subplot(2,2,1)
stem(k,real(X4))
title('real part of DFT[jxim[n]]')
subplot(2,2,2)
stem(k,imag(X4))
title('imag part of DFT[jxim[n]]')
subplot(2,2,3)
stem(k,real(Xk_ca))
title('real part of Xca[k]')
subplot(2,2,4)
stem(k,imag(Xk_ca))
title('imag part of Xca[k]')

figure
subplot(2,2,1)
stem(k,real(X5))
title('real part of DFT[xcs[n]]')
subplot(2,2,2)
stem(k,imag(X5))
title('imag part of DFT[xcs[n]]')
subplot(2,2,3)
stem(k,real(Xk_re))
title('real part of Xre[k]')
subplot(2,2,4)
stem(k,imag(Xk_re))
title('imag part of Xre[k]')

figure
subplot(2,2,1)
stem(k,real(X6))
title('real part of DFT[xca[n]]')
subplot(2,2,2)
stem(k,imag(X6))
title('imag part of DFT[xca[n]]')
subplot(2,2,3)
stem(k,real(1j*Xk_im))
title('real part of jXim[k]')
subplot(2,2,4)
stem(k,imag(1j*Xk_im))
title('imag part of jXim[k]')

得到的结果如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墨痕_777

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值