用MATLAB理解正弦波序列的DFT

前言

在穿戴式嵌入式模拟前端(AFE-Analog Front End)设计中,常常要测量人体组织的阻抗。通常的做法是向人体组织发出一段某一频率的正弦波,测量组织两端的电压与流过组织的电流,绕后分别计算电压与电流的离散傅里叶变换,得到二者的频域特性。最后将电压幅值除以电流幅值的到组织阻抗幅值,电压相位减去电流相位得到组织的阻抗相位。

本文分析了正弦波、余弦波被抽样后的得到的序列的DFT数据特征,以及相位不为零的情况下的DFT数据特征,并用MATLAB工具验证了数据特征,这对阻抗测量的嵌入式软件设计具有一定的指导作用。

已知单位矩形序列的DFT为单位冲击序列的N倍
X ( k ) = D F T ( R ( n ) ) = N δ ( k ) X(k) = {\rm DFT}(R(n)) = N \delta(k) X(k)=DFT(R(n))=Nδ(k)

以及时域内的调制对应频域内的搬移:
如 果 : X ( k ) = D F T ( x ( n ) ) 和 : y ( n ) = x ( n ) W N − l n 则 有 : Y ( k ) = D F T ( y ( n ) ) = X ( ( k − l ) ) N 如果:X(k) = {\rm DFT}(x(n))\\ 和:y(n) = x(n)W_N^{-ln} \\ 则有: Y(k)= {\rm DFT}(y(n))=X((k-l))_N X(k)=DFT(x(n))y(n)=x(n)WNlnY(k)=DFT(y(n))=X((kl))N
其中: W N = e x p ( − 2 π i N ) W_N={\rm exp}(\frac{-2\pi i}{N}) WN=exp(N2πi)

现在想要推出正弦波序列和余弦波序列的离散傅里叶变换

欧拉公式

正弦信号、余弦信号与指数信号的关系可用欧拉公式表示:
e x p ( i x ) = cos ⁡ ( x ) + i sin ⁡ ( x ) {\rm exp}(ix)=\cos(x)+i\sin(x) exp(ix)=cos(x)+isin(x)

e x p ( 2 π n i N ) = cos ⁡ ( 2 π n N ) + i sin ⁡ ( 2 π n N ) {\rm exp}(\frac{2\pi ni}{N})=\cos(\frac{2\pi n}{N})+i\sin(\frac{2\pi n}{N}) exp(N2πni)=cos(N2πn)+isin(N2πn)

正余弦函数的DFT

1. 包含一个正余弦周期、相位为0的序列的DFT

长度为 N N N的指数序列的DFT:
X ( k ) = D F T ( e x p ( 2 π n i N ) ) = N δ ( ( k − 1 ) ) N n , k = 0 , 1 , 2 , . . . , N l − 1 X(k)={\rm DFT(exp}(\frac{2\pi ni}{N}))=N\delta((k-1))_N\\ n,k=0,1,2,...,Nl-1 X(k)=DFT(exp(N2πni))=Nδ((k1))Nn,k=0,1,2,...,Nl1
长度为 N N N的余弦序列的DFT:
X ( k ) = D F T ( cos ⁡ ( 2 π n N ) ) = N 2 ( δ ( ( k − 1 ) ) N + δ ( ( k − N + 1 ) ) N ) n , k = 0 , 1 , 2 , . . . , N l − 1 X(k)={\rm DFT} (\cos(\frac{2\pi n}{N}))=\frac{N}{2}({\delta((k-1))_N+\delta((k-N+1))_N})\\ n,k=0,1,2,...,Nl-1 X(k)=DFT(cos(N2πn))=2N(δ((k1))N+δ((kN+1))N)n,k=0,1,2,...,Nl1
长度为 N N N的正弦序列的DFT
X ( k ) = D F T ( sin ⁡ ( 2 π n N ) ) = N i 2 ( δ ( ( k − 1 ) ) N − δ ( ( k − N + 1 ) ) N ) n , k = 0 , 1 , 2 , . . . , N l − 1 X(k)={\rm DFT} (\sin(\frac{2\pi n}{N}))=\frac{Ni}{2}({\delta((k-1))_N-\delta((k-N+1))_N})\\ n,k=0,1,2,...,Nl-1 X(k)=DFT(sin(N2πn))=2Ni(δ((k1))Nδ((kN+1))N)n,k=0,1,2,...,Nl1
以下MATLAB上运行的用m语言写的8个数据、一个周期、相位为0的余弦波序列 x 及其用FFT算法计算的离散傅里叶变换 X,以及它们的波形图 。余弦波序列由8个数据组成, 三张图从左到右依次为 序列x, 傅里叶变换 X 的实部和 X 的虚部。

从图上可以看出,8个数据、一个周期、相位为0的余弦波序列的DFT的特征为:

实部: X ( 2 ) = X ( 8 ) = 4 X(2) = X(8)=4 X(2)=X(8)=4,其余为零;
虚部:全为0.
注解:MATLAB的序列号是从 1 开始计算,而不是从 0 开始计算的。

N=8; 
n = 0:1:(N - 1); 
x=cos(2*pi*(n-0)/N); 
figure(1); 
plot(x);
X=fft(x); 
figure(2); 
stem(real(X),'filled'); 
figure(3); 
stem(imag(X),'filled'); 

包含1个周期、相位为0的余弦波序列的离散傅里叶变换

2. 包含一个正余弦周期、相位不为0的序列的DFT

长度为 N N N,相位右移 m m m的指数序列的DFT:
X ( k ) = D F T ( e x p ( 2 π ( n − m ) i N ) ) = N δ ( ( k − 1 ) ) N e x p ( − 2 π m k N ) n , k = 0 , 1 , 2 , . . . , N l − 1 X(k)={\rm DFT(exp}(\frac{2\pi (n-m)i}{N}))=N\delta((k-1))_N{\rm exp}(\frac{-2\pi mk}{N})\\ n,k=0,1,2,...,Nl-1 X(k)=DFT(exp(N2π(nm)i))=Nδ((k1))Nexp(N2πmk)n,k=0,1,2,...,Nl1
长度为 N N N,相位右移 m m m的余弦序列的DFT:
X ( k ) = D F T ( cos ⁡ ( 2 π ( n − m ) N ) ) = N 2 ( δ ( ( k − 1 ) ) N + δ ( ( k − N + 1 ) ) N ) cos ⁡ ( − 2 π m k N ) n , k = 0 , 1 , 2 , . . . , N l − 1 X(k)={\rm DFT} (\cos(\frac{2\pi (n-m)}{N}))=\frac{N}{2}({\delta((k-1))_N+\delta((k-N+1))_N}) {\cos}(\frac{-2\pi mk}{N})\\ n,k=0,1,2,...,Nl-1 X(k)=DFT(cos(N2π(nm)))=2N(δ((k1))N+δ((kN+1))N)cos(N2πmk)n,k=0,1,2,...,Nl1
长度为 N N N,相位右移 m m m的正弦序列的DFT
X ( k ) = D F T ( sin ⁡ ( 2 π ( n − m ) N ) ) = N i 2 ( δ ( ( k − 1 ) ) N − δ ( ( k − N + 1 ) ) N ) sin ⁡ ( − 2 π m k N ) n , k = 0 , 1 , 2 , . . . , N l − 1 X(k)={\rm DFT} (\sin(\frac{2\pi (n-m)}{N}))=\frac{Ni}{2}({\delta((k-1))_N-\delta((k-N+1))_N}){\sin}(\frac{-2\pi mk}{N})\\ n,k=0,1,2,...,Nl-1 X(k)=DFT(sin(N2π(nm)))=2Ni(δ((k1))Nδ((kN+1))N)sin(N2πmk)n,k=0,1,2,...,Nl1
以下MATLAB上运行的用m语言写的8个数据、一个周期、相位右移 1 的余弦波序列 x 及其用FFT算法计算的离散傅里叶变换 X,以及它们的波形图 。余弦波序列由8个数据组成, 三张图从左到右依次为 序列x, 傅里叶变换 X 的实部和 X 的虚部。

从图上可以看出,8个数据、一个周期、相位右移 1 的余弦波序列的DFT的特征为:

实部: X ( 2 ) = X ( 8 ) = 8 2 cos ⁡ ( − 2 π 8 ) = 2.828 X(2) = X(8)=\frac{8}{2}\cos(-\frac{2\pi}{8})=2.828 X(2)=X(8)=28cos(82π)=2.828,其余为零;
虚部: X ( 2 ) = X ( 8 ) = 8 2 sin ⁡ ( − 2 π 8 ) = − 2.828 X(2) = X(8)=\frac{8}{2}\sin(-\frac{2\pi}{8})=-2.828 X(2)=X(8)=28sin(82π)=2.828,其余为零;
注解:MATLAB的序列号是从 1 开始计算,而不是从 0 开始计算的。

N=8; 
n = 0:1:(N - 1); 
x=cos(2*pi*(n-1)/N); 
figure(1); 
plot(x);
X=fft(x); 
figure(2); 
stem(real(X),'filled'); 
figure(3); 
stem(imag(X),'filled'); 

包含1个周期、相位不为0的余弦波序列的离散傅里叶变换

3. 包含多个正余弦周期、相位为0的序列的DFT

包含 l l l 个周期、每个周期 N N N个数据、长度为 N l Nl Nl的指数序列的DFT:
X ( k ) = D F T ( e x p ( 2 π n l i N ) ) = N l δ ( ( k − l ) ) N , n , k = 0 , 1 , 2 , . . . , N l − 1 X(k)={\rm DFT(exp}(\frac{2\pi nli}{N}))=Nl\delta((k-l))_N, \\ n,k=0,1,2,...,Nl-1 X(k)=DFT(exp(N2πnli))=Nlδ((kl))N,n,k=0,1,2,...,Nl1
包含 l l l 个周期、每个周期 N N N个数据、长度为 N l Nl Nl的余弦序列的DFT:
X ( k ) = D F T ( cos ⁡ ( 2 π n l N ) ) = N l 2 ( δ ( ( k − l ) ) N + δ ( ( k − N + l ) ) N ) n , k = 0 , 1 , 2 , . . . , N l − 1 X(k)={\rm DFT} (\cos(\frac{2\pi nl}{N}))=\frac{Nl}{2}({\delta((k-l))_N+\delta((k-N+l))_N})\\ n,k=0,1,2,...,Nl-1 X(k)=DFT(cos(N2πnl))=2Nl(δ((kl))N+δ((kN+l))N)n,k=0,1,2,...,Nl1
包含 l l l 个周期、每个周期 N N N个数据、长度为 N l Nl Nl的正弦序列的DFT
X ( k ) = D F T ( sin ⁡ ( 2 π n l N ) ) = N i 2 ( δ ( ( k − l ) ) N − δ ( ( k − N + l ) ) N ) n , k = 0 , 1 , 2 , . . . , N l − 1 X(k)={\rm DFT} (\sin(\frac{2\pi nl}{N}))=\frac{Ni}{2}({\delta((k-l))_N-\delta((k-N+l))_N})\\ n,k=0,1,2,...,Nl-1 X(k)=DFT(sin(N2πnl))=2Ni(δ((kl))Nδ((kN+l))N)n,k=0,1,2,...,Nl1
以下MATLAB上运行的用m语言写的16个数据、2个周期、相位为0的余弦波序列 x 及其用FFT算法计算的离散傅里叶变换 X,以及它们的波形图 。每个周期的余弦波由8个数据组成, 三张图从左到右依次为 序列x, 傅里叶变换 X 的实部和 X 的虚部。

从图上可以看出,16个数据、2个周期、相位为0的余弦波序列的DFT的特征为:

实部: X ( 3 ) = X ( 15 ) = 8 X(3) = X(15)=8 X(3)=X(15)=8,其余为零;
虚部:全为0.
注解:MATLAB的序列号是从 1 开始计算,而不是从 0 开始计算的。

N=8; 
n = 0:1:(2*N - 1); 
x=cos(2*pi*(n-0)/N); 
figure(1); 
plot(x);
X=fft(x); 
figure(2); 
stem(real(X),'filled'); 
figure(3); 
stem(imag(X),'filled'); 

包含两个周期、相位为0的余弦波序列的离散傅里叶变换

4. 包含多个正余弦周期、相位不为0的序列的DFT

包含 l l l 个周期、每个周期 N N N个数据、长度为 N l Nl Nl、相位右移 m m m的指数序列的DFT:
X ( k ) = D F T ( e x p ( 2 π ( n − m ) l i N ) ) = N l δ ( ( k − l ) ) N e x p ( − 2 π m k N ) X(k)={\rm DFT(exp}(\frac{2\pi (n-m)li}{N}))=Nl\delta((k-l))_N{\rm exp}(\frac{-2\pi mk}{N}) X(k)=DFT(exp(N2π(nm)li))=Nlδ((kl))Nexp(N2πmk)
包含 l l l 个周期、每个周期 N N N个数据、长度为 N l Nl Nl、相位右移 m m m的余弦序列的DFT:
X ( k ) = D F T ( cos ⁡ ( 2 π ( n − m ) l N ) ) = N l 2 ( δ ( ( k − l ) ) N + δ ( ( k − N + l ) ) N ) cos ⁡ ( − 2 π m k N ) X(k)={\rm DFT} (\cos(\frac{2\pi (n-m)l}{N}))=\frac{Nl}{2}({\delta((k-l))_N+\delta((k-N+l))_N}){\cos}(\frac{-2\pi mk}{N}) X(k)=DFT(cos(N2π(nm)l))=2Nl(δ((kl))N+δ((kN+l))N)cos(N2πmk)
包含 l l l 个周期、每个周期 N N N个数据、长度为 N l Nl Nl、相位右移 m m m的正弦序列的DFT
X ( k ) = D F T ( sin ⁡ ( 2 π ( n − m ) l N ) ) = N l 2 ( δ ( ( k − l ) ) N − δ ( ( k − N + l ) ) N ) sin ⁡ ( − 2 π m k N ) X(k)={\rm DFT} (\sin(\frac{2\pi (n-m)l}{N}))=\frac{Nl}{2}({\delta((k-l))_N-\delta((k-N+l))_N}){\sin}(\frac{-2\pi mk}{N}) X(k)=DFT(sin(N2π(nm)l))=2Nl(δ((kl))Nδ((kN+l))N)sin(N2πmk)
以下MATLAB上运行的用m语言写的16个数据、2个周期、相位右移 1 的余弦波序列 x 及其用FFT算法计算的离散傅里叶变换 X,以及它们的波形图 。每个周期的余弦波由8个数据组成, 三张图从左到右依次为 序列x, 傅里叶变换 X 的实部和 X 的虚部。

从图上可以看出,16个数据、2个周期、相位右移 1 的余弦波序列的DFT的特征为:

实部: X ( 3 ) = X ( 15 ) = 8 ∗ 2 2 cos ⁡ ( − 2 π 8 ) = 5.656 X(3) = X(15)=\frac{8*2}{2}\cos(-\frac{2\pi}{8})=5.656 X(3)=X(15)=282cos(82π)=5.656,其余为零;
虚部: X ( 3 ) = X ( 15 ) = 8 ∗ 2 2 sin ⁡ ( − 2 π 8 ) = − 5.656 X(3) = X(15)=\frac{8*2}{2}\sin(-\frac{2\pi}{8})=-5.656 X(3)=X(15)=282sin(82π)=5.656,其余为零;
注解:MATLAB的序列号是从 1 开始计算,而不是从 0 开始计算的。

N=8; 
n = 0:1:(2*N - 1); 
x=cos(2*pi*(n-1)/N); 
figure(1); 
plot(x);
X=fft(x); 
figure(2); 
stem(real(X),'filled'); 
figure(3); 
stem(imag(X),'filled'); 

包含两个周期、相位不为0的余弦波序列的离散傅里叶变换

结论

正弦波序列的DFT变换后的频率域序列 X ( k ) X(k) X(k)只在某两项上不为零,其余项都为0. 不为零的两项数值相等,而且反映了正弦波序列的全部信息:其幅度代表正弦波的幅度,其相位代表了正弦波的相位。因此,
将采集到的正弦波序列通过DFT变换为频率域的序列,只需要计算非0项的幅度和相位,便可获得正弦波序列的幅度和相位信息。

正弦波的相位信息的精度取决于采样率。在正弦波的一个周期中如果有 N N N个采样点,则相位的精度为 2 π N \frac{2\pi}{N} N2π.

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我会尽力回答您的问题。 首先,频域采样定理是指:对于一个带限信号,如果采样频率高于信号的最大频率两倍,那么在采样后的离散时间域信号上进行DFT变换可以完全恢复原信号的频域信息。这个定理在数字信号处理中有着重要的应用。 利用正弦波验证频域采样定理的步骤如下: 1. 生成一个带限正弦波信号,频率为$f$,幅度为$A$,采样频率为$2f$。 2. 对信号进行采样,得到一个离散时间域信号$x[n]$。 3. 对$x[n]$进行DFT变换,得到频域信号$X[k]$,其中$k$为频域下标。 4. 对$X[k]$进行幅度谱归一化,即$X[k]=X[k]/N$,其中$N$为采样点数。 5. 绘制幅值谱随频率变化的曲线,与原正弦波的频域信息进行比较。 如果幅值谱随频率变化的曲线与原正弦波的频域信息相同,说明采样后的离散时间域信号上进行DFT变换可以完全恢复原信号的频域信息,验证了频域采样定理。 MATLAB代码如下: ```matlab f = 1000; % 正弦波频率 A = 1; % 正弦波幅度 fs = 2*f; % 采样频率 T = 1/f; % 正弦波周期 t = 0:T/1000:2*T; % 时间序列 x = A*sin(2*pi*f*t); % 正弦波信号 n = 1:1:2*f*T; % 采样点序列 xn = A*sin(2*pi*f*n/fs); % 采样后的信号 Xk = fft(xn); % DFT变换 Xk = Xk/n; % 幅度谱归一化 f_axis = (0:2*f-1)*fs/(2*f); % 频率轴 plot(f_axis,abs(Xk)); % 绘制幅值谱 xlabel('Frequency (Hz)'); ylabel('Magnitude'); title('Spectrum of the sampled signal'); ``` 希望这个回答能够帮助到您,如果您有其他问题,请随时提出。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

JERRY. LIU

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

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

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

打赏作者

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

抵扣说明:

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

余额充值