复正弦信号、实数信号的DFT

本文将介绍复正弦信号和实数信号的DFT性质,内容包括:

  1. 复正弦信号的定义以及DFT性质
  2. 实数信号的定义以及性质
  3. 代码实例

复正弦信号

首先说明,复正弦信号只是一种数学定义上的信号,在实际生活中没有发现过这种信号

我们先来看一种较为简单且比较有规律的复正弦信号,它的定义如下:

x1[n]=ej2πk0n/Nn=0,1,2,...,N-1x_1[n] = e^{j2\pi k_0 n / N} \\ \text{n=0,1,2,...,N-1} x1​[n]=ej2πk0​n/Nn=0,1,2,...,N-1

其中,eee是自然常熟,N表示信号的个数。

至于k0k_0k0​,它是很关键的一个参数,我们可以将它理解为x1[n]x_1[n]x1​[n]信号的周期个数。通常我们只能对一小段信号做DFT,因此需要先对信号截断,如果截断的信号刚好是整数周期,即k0k_0k0​是一个整数,那么信号不发生泄露;相反,如果截断信号不是整数周期,即k0k_0k0​是一个浮点数,那么发现信号泄露。

关于信号泄露,请参看这篇文章 什么是泄露

复正弦信号的DFT

将复正弦信号的定义直接套上DFT的公式可以推出其DFT形式:
X1[k]=∑n=0N−1x1[n]e−j2πkn/N=∑n=0N−1ej2πk0n/Ne−j2πkn/N=∑n=0N−1ej2π(k0−k)n/N(1)\begin{array}{l} X_1[k] &= \sum_{n=0}^{N-1} x_1[n] e^{-j2\pi k n / N} \\ &= \sum_{n=0}^{N-1} e^{j2\pi k_0 n / N}e^{-j2\pi k n / N} \\ &= \sum_{n=0}^{N-1} e^{j2\pi(k_0 - k)n / N}\\ \end{array}\tag{1} X1​[k]​=∑n=0N−1​x1​[n]e−j2πkn/N=∑n=0N−1​ej2πk0​n/Ne−j2πkn/N=∑n=0N−1​ej2π(k0​−k)n/N​(1)

当 k0=kk_0 = kk0​=k 时,ej2π(k0−k)n/N=e0=1e^{j2\pi(k_0 - k)n / N} = e^{0} = 1ej2π(k0​−k)n/N=e0=1,因此
X1[k]=∑n=0N−11=N,if k0=kX_1[k] = \sum_{n=0}^{N-1} 1 = N, \text{if } k_0=kX1​[k]=n=0∑N−1​1=N,if k0​=k

当 k0≠kk_0 \neq kk0​​=k 时,利用等比数列求和公式可得
X1[k]=1−ej2π(k0−k)n1−ej2π(k0−k)n/N=0\begin{array}{l} X_1[k] &= \frac{1-e^{j2\pi(k_0 - k)n}}{1-e^{j2\pi(k_0 - k)n/N}} \\ &= 0 \end{array} X1​[k]​=1−ej2π(k0​−k)n/N1−ej2π(k0​−k)n​=0​


X1[k]={N,if k0=k0,if k0≠kX_1[k] = \begin{cases} N, & \text{if $k_0 = k$ } \\ 0, & \text{if $k_0 \neq k$} \end{cases} X1​[k]={N,0,​if k0​=k if k0​​=k​

这里仔细说明下X1[0]=0X_1[0] = 0X1​[0]=0是怎么来的

  1. k0k_0k0​和kkk都是整数,那他们的差k0−kk_0-kk0​−k也是整数
  2. 当N是整数时,ej2πN=1e^{j2\pi N} = 1ej2πN=1,因此1−ej2π(k0−k)n=01-e^{j2\pi(k_0 - k)n} = 01−ej2π(k0​−k)n=0
  3. 根据1,2,推出X1[0]=0X_1[0] = 0X1​[0]=0

等比数列求和的推导,可以参考这个公式:
∑k=0Nzk={1−zN+11−z,if z≠1N,if z=1\sum_{k=0}^{N} z^k = \begin{cases} \frac{1-z^{N+1}}{1-z}, & \text{if $z\neq 1$ } \\ N, & \text{if $z = 1$} \end{cases} k=0∑N​zk={1−z1−zN+1​,N,​if z​=1 if z=1​

复正弦信号DFT实例

我们将通过代码来展示复正弦信号的性质,首先生成一段复正弦信号,然后进行DFT,画出结果

import 需要的包

import numpy as np
import matplotlib.pyplot as pltfrom scipy.fftpack import fft%matplotlib inline

定义生成复正弦信号的函数

def generate_complex_signal(num_sample, k0):'''generate a complex signalnum_sample : 信号的个数,即公式中的Nk0 : 周期个数returnsx : 复正弦信号'''n = np.arange(num_sample)x = np.exp(1j*2*np.pi*k0*n/num_sample)return x

生成信号,进行DFT,画出结果

当k0是整数时,DFT后的结果与预期的一致

# DFT and plot the results
num_sample = 100
k0 = 20
x = generate_complex_signal(num_sample, k0)X = fft(x)plt.figure(figsize=(10,6))
plt.subplot(211)
plt.plot(np.real(x))plt.subplot(212)
plt.plot(np.real(X))
plt.show()

实数信号

我们生活中遇到的信号都是实数信号,它的定义如下:
x2[n]=A0cos⁡(2πk0n/N)=A02(ej2πk0n/N+e−j2πk0n/N)x_2[n] = A_0 \cos (2\pi k_0 n/N) = \frac{A_0}{2}(e^{j2\pi k_0 n/N} + e^{-j2\pi k_0 n/N}) x2​[n]=A0​cos(2πk0​n/N)=2A0​​(ej2πk0​n/N+e−j2πk0​n/N)

额…虽然生活中的信号都是实数信号,但是上面的式子是对实数信号的超高度浓缩版本,是最简单的版本。实际中的信号模型更为复杂。

实数信号的DFT

将实数信号带入DFT等式中

X2[k]=∑n=0N−1x2[n]e−j2πkn/N=∑n=0N−1A02(ej2πk0n/N+e−j2πk0n/N)e−j2πkn/N=∑n=0N−1A02e−j2π(k−k0)n/N+∑n=0N−1A02e−j2π(k+k0)n/N(2)\begin{array}{l} X_2[k] &= \sum_{n=0}^{N-1} x_2[n] e^{-j2\pi k n / N} \\ &= \sum_{n=0}^{N-1} \frac{A_0}{2}(e^{j2\pi k_0 n/N} + e^{-j2\pi k_0 n/N}) e^{-j2\pi k n / N} \\ &= \sum_{n=0}^{N-1} \frac{A_0}{2}e^{-j2\pi(k-k_0) n / N} + \sum_{n=0}^{N-1} \frac{A_0}{2} e^{-j2\pi(k+k_0) n / N} \\ \end{array}\tag{2} X2​[k]​=∑n=0N−1​x2​[n]e−j2πkn/N=∑n=0N−1​2A0​​(ej2πk0​n/N+e−j2πk0​n/N)e−j2πkn/N=∑n=0N−1​2A0​​e−j2π(k−k0​)n/N+∑n=0N−1​2A0​​e−j2π(k+k0​)n/N​(2)

当k=k0k=k_0k=k0​或者k=−k0k=-k_0k=−k0​时,(2)式中一项为0,另一项为NA02N\frac{A_0}{2}N2A0​​

否则(2)式为0


X2[k]={NA02,if k=k0,−k00,if k≠k0X_2[k] = \begin{cases} N\frac{A_0}{2}, & \text{if $k = k_0, -k_0$ } \\ 0, & \text{if $k \neq k_0$} \end{cases} X2​[k]={N2A0​​,0,​if k=k0​,−k0​ if k​=k0​​

实数信号DFT实例

我们将通过代码来展示实数信号的性质,首先生成一段复正弦信号,然后进行DFT,画出结果

def generate_real_signal(num_sample, A, k0):'''generate real signalnum_sample : 信号的个数,即公式中的NA  : 振幅k0 : 周期个数returnsx : 实数信号'''hN = num_sample//2n = np.arange(-hN, hN)x = A * np.cos( 2*np.pi*k0*n/num_sample )return x

通过打印出结果,我们发现确实有2个峰值,但是并不是k0k_0k0​和−k0-k_0−k0​

其实只要做一次交换就可以,具体请看代码Y的实现

# DFT and plot the results
num_sample = 100
k0 = 20
A = 0.8
x = generate_real_signal(num_sample, A, k0)X = fft(fftbuffer)plt.figure(figsize=)
plt.subplot(311)
plt.plot(np.real(x))plt.subplot(312)
plt.plot(np.real(X))hM1 = (num_sample+1)//2
hM2 = num_sample//2
Y = np.zeros(num_sample)
Y[:hM1] = X[-hM1:]
Y[-hM2:] = X[:hM1]
plt.subplot(313)
x_axis = np.arange(-hM1, hM2)
plt.plot(x_axis, np.real(Y))
plt.show()

复正弦信号、实数信号的DFT相关推荐

  1. 复指数与高斯函数乘积的傅里叶变换_希尔伯特变换:将实数信号变换成解析信号?节省带宽,提升效率...

    通信中的调制,我们可以看作为在频域范围内的频谱搬移技术. 对于一个原始信号m(t),我们加上一个直流分量A0,再乘以载波信号,就得到了调幅AM信号. AM信号,之前的文章介绍过. 模拟调制:我们为什么 ...

  2. DSP matlab产生正弦数字采样信号(M2.4)

    一些基础知识: 模拟信号被采样形成数字信号,假设采样频率是fsf_sfs​,则采样间隔是T=1/fsT=1/f_sT=1/fs​,设nnn是采样序号,则连续时间t=nTt=nTt=nT,其中nnn是正 ...

  3. 信号系统 | 信号的概念与常用信号

    信号的本质是函数,因此信号处理方法具有普适性,应用领域非常广泛.本篇介绍信号的基本概念以及一些典型的信号,主要参考奥本海姆的经典教材<信号与系统>,微信搜索公众号PurePlay,后台回复 ...

  4. 傅里叶分析的方方面面:复正弦、负频率

    简单来说,傅里叶分析即频域分析,给我们提供了一种从频域看待信号的方法.先从信号分析(信号展开)理论讲起. 信号分析理论 信号的表示方式并不唯一,对于给定的信号有无数种展开方式[1].如一个Ψ\Psi域 ...

  5. 数字信号处理学习笔记[1] 离散信号 奇异信号 抽样定理

    文章目录 2 离散信号和抽样定理 2.1 离散信号 奇异信号 2.2 连续信号的离散化,正弦波的抽样问题 2.3 带限信号与奈奎斯特频率 用卷积考察抽样定理 2.4 离散信号的频谱和抽样定理 2 离散 ...

  6. matlab复数信号_信号之间的时延估计(续)

    说明 这篇文章是之前<信号之间的时延估计>的续篇,中间隔了很长时间才写这一篇,是因为期间一直有其它事情要做,而且感觉对GCC的一些关键点还没有考虑清楚.后来评论区一位朋友在关心续篇的进度, ...

  7. linux系统发送信号的系统调用是,linux系统编程之信号:信号发送函数sigqueue和信号安装函数sigaction...

    信号发送函数sigqueue和信号安装函数sigaction sigaction函数用于改变进程接收到特定信号后的行为. sigqueue()是比较新的发送信号系统调用,主要是针对实时信号提出的(当然 ...

  8. linux 程序收到sigsegv信号_信号

    当其他方式不起作用时(例如标准输入被冻结),信号是提供低优先级信息和用户与其程序交互的便捷方式.它们允许程序在事件发生时清理或执行操作.有时,程序可以选择忽略受支持的事件.由于处理信号的方式,制作一个 ...

  9. 【数字信号处理】相关函数 ( 周期信号 | 周期信号的自相关函数 )

    文章目录 一.周期信号 二.周期信号的自相关函数 一.周期信号 信号 根据 " 周期性 " 进行分类 , 可以分为 " 周期信号 " 和 " 非周期信 ...

最新文章

  1. Java 和 HTTP 的那些事(四) HTTPS 和 证书
  2. github mysql 数据恢复_记一次MySQL删库的数据恢复
  3. 右手螺旋判断磁感应强度方向_高考丨电磁感应丨感应电动势
  4. java 正则表达式 替换括号,Java正则表达式:如何替换方括号内的所有字符?
  5. 面试官留步!听我跟你侃会儿Docker原理
  6. mysql连接编码设置_MySQL基础 - 编码设置
  7. struts2第一个程序 Helloworld
  8. md5加密、Des加密对称可逆加密、RSA非对称可逆加密、https单边验证、银行U盾双边认证...
  9. linux下包管理器
  10. 野火ISO-V2学习
  11. 个人开发者上架Android应用市场感受
  12. 小程序怎么接入机器人客服系统
  13. 一言不和就自己写了个编程语言
  14. 解决安卓手机卡顿的七个技巧
  15. [论文笔记] 视频广告内容结构的多模态表示学习
  16. 拼多多商品详情接口,拼多多详情页接口,宝贝详情页接口,商品属性接口,商品信息查询,商品详细信息接口,h5详情,拼多多APP详情
  17. 做数学建模不得不会的数据特征分析---相关性分析
  18. 使用jdk查看jks文件信息
  19. SPSS数据分析软件的安装与介绍(附网盘链接)
  20. OBD模拟器,ELM327开发工具,OBD开发利器

热门文章

  1. android模拟器华为账号,夜神模拟器怎么玩华为账号游戏
  2. apple pay 技术_如何在手机上设置Apple Pay和Google电子钱包
  3. 完全卸载TeamViewer与重新安装TeamViewer 7(含单文件版V12主控端)
  4. mysql大于号小于号写法
  5. Nero8直接把APE带CUE映像文件刻录CD方法(转帖)
  6. 数据库学习之(5)详解DBMS
  7. Windbg调试学习
  8. Nuvoton emWin HMI Solution
  9. 深度学习之前馈神经网络(前向传播和误差反向传播)
  10. 使用ResNet-50实现图像分类任务