数字信号处理Python示例(2-2)脉冲序列函数的频域视图
文章目录
- 前言
- 一、傅里叶变换(FT)、离散傅里叶变换(DFT)与快速傅里叶变换(FFT)
- 二、脉冲序列函数的离散傅里叶变换(DFT)
- 三、对脉冲序列函数进行FFT的Python代码
- 四、仿真结果及分析
- 写在后面的话
前言
本文首先介绍了傅里叶变换、离散傅里叶变换和快速傅里叶变换的概念,然后指出脉冲序列函数的离散傅里叶变化是另一个脉冲序列函数。然后给出脉冲序列离散傅里叶变换的Python代码与仿真结果,并对结果进行分析。
一、傅里叶变换(FT)、离散傅里叶变换(DFT)与快速傅里叶变换(FFT)
傅里叶变换是一种在数学、工程学、物理学等领域非常重要的工具,它能够将一个在时域(或空间域)的信号转换到频域。简单来说,傅里叶变换可以将一个信号分解成不同频率的正弦波和余弦波的组合,这样就可以更容易地分析信号的频率成分。
傅里叶变换的基本形式包括连续傅里叶变换(Continuous Fourier Transform, CFT)和离散傅里叶变换(Discrete Fourier Transform, DFT)。其中,DFT是一种在数字信号处理中广泛使用的算法,它将离散时间信号从时域转换到频域。
实际使用中,为了提高计算效率,通常采用快速傅里叶变换(FFT),它是计算DFT的一种高效算法。
二、脉冲序列函数的离散傅里叶变换(DFT)
脉冲序列函数的时间域表达式为:

对脉冲序列函数进行傅里叶变换,我们得到其频域表示:

可见,若对一个脉冲序列进行傅里叶变换,将得到另一个脉冲序列。
三、对脉冲序列函数进行FFT的Python代码
在这里,生成了两个梳状函数(脉冲序列函数),分别为c1(t)和c2(t)。在梳状函数c1(t)中,连续脉冲之间的间隔是0.1秒,而在梳状函数c2(t)中,连续脉冲之间的间隔是0.05秒。对这两个梳状函数进行傅里叶变换,得到相应的幅度谱|C1(f)|和|C2(f)|。在幅度谱(|C1(f)|)中,连续峰值之间的间隔是1/0.1 = 10,而在幅度谱(|C2(f)|)中,连续峰值之间的间隔是1/0.05 = 20。
# 导入必要的库
import numpy as np # numpy用于数学计算
import matplotlib.pyplot as plt # 用于绘图
from scipy.fft import fft, fftshift # 用于信号处理
# 步骤 1: 生成梳状函数
Fs = 100 # 采样频率
t = np.arange(0, 1, 1/Fs) # 时间向量,从0到1秒,步长为1/Fs
f = np.linspace(-Fs/2, Fs/2, len(t), endpoint=False) # 频率向量
# 定义梳状函数c1的周期T1
T1 = 0.1
c1 = np.zeros(len(t)) # 初始化c1为全零数组
c1[::int(Fs * T1)] = 1 # 每隔Fs*T1个采样点设置一个元素为1
# 定义梳状函数c2的周期T2
T2 = 0.05
c2 = np.zeros(len(t)) # 初始化c2为全零数组
c2[::int(Fs * T2)] = 1 # 每隔Fs*T2个采样点设置一个元素为1
# 步骤 2: 对梳状函数进行傅里叶变换
C1 = fftshift(fft(c1)) # 对c1进行傅里叶变换
C2 = fftshift(fft(c2)) # 对c2进行傅里叶变换
# 步骤 3: 绘制结果
plt.subplot(2, 2, 1) # 创建一个2x2的子图网格,并选择第一个子图
plt.stem(t, c1) # 绘制c1的时间域图像
plt.xlabel('时间')
plt.ylabel('幅度')
plt.title('$c_1(t)$')
plt.grid(True)
plt.subplot(2, 2, 2)
plt.plot(f, np.abs(C1)/len(t)) # 绘制C1的频域图像并归一化幅度
plt.xlabel('频率')
plt.ylabel('幅度')
plt.title('$|C_1(f)|$')
plt.grid(True)
plt.subplot(2, 2, 3)
plt.stem(t, c2) # 绘制c2的时间域图像
plt.xlabel('时间')
plt.ylabel('幅度')
plt.title('$c_2(t)$')
plt.grid(True)
plt.subplot(2, 2, 4)
plt.plot(f, np.abs(C2)/len(t)) # 绘制C2的频域图像并归一化幅度
plt.xlabel('频率')
plt.ylabel('幅度')
plt.title('$|C_2(f)|$')
plt.grid(True)
plt.tight_layout() # 自动调整子图参数,使之填充整个图像区域
plt.show() # 显示图形
四、仿真结果及分析
以下是执行代码后画图的结果。

结果分析:
(1)函数c1(t)中两个连续样本之间的间隔是0.1秒。
(2)C1(f)中两个连续峰值之间的间隔是10赫兹。
(3)梳状函数c2(t)中两个连续样本之间的间隔是0.5秒。
(4)C2(f)中两个连续峰值之间的间隔是20赫兹。
(5)这个实验说明了时间和频率是相互倒数的关系。即,一个域的压缩相当于另一个域的扩展,反之亦然。
(6)脉冲序列函数的傅里叶变换结果是一个脉冲序列函数。
写在后面的话
这是《数字信号处理python示例》系列文章的第23篇。整个系列将使用python语言示例说明数字信号处理的基本原理与工程应用。给出的所有Python程序将努力做到简单且具有说明性。在数字信号处理的理论方面,将尽量避免数学上的推导与证明,而注重其物理意义阐述和工程应用的介绍。
感谢您的阅读!
