数字信号处理Python示例(18)正弦信号的频率与采样率
文章目录
- 前言
- 一、正弦信号频率(Frequency, f)
- 二、采样率(Sample Rate, fs)
- 三、两者之间的关系
- 四、举例
- 五、生成相同采样率、不同频率正弦波的Python代码
- 六、仿真结果及分析
- 写在后面的话
前言
正弦信号的频率和采样率是数字音频处理中的两个重要概念,本文以正弦信号为例介绍了信号频率和采样率这两个概念,然后给出生成同一采样率不同频率两个正弦波的Python代码。
一、正弦信号频率(Frequency, f)
正弦信号的频率指的是信号每秒钟完成的周期数,单位是赫兹(Hz)。一个正弦波可以用以下数学表达式来描述:
f(t) = A*sin(2πft+ϕ)
其中:
• A 是振幅(Amplitude)
• f 是正弦波的振荡频率,也即频率(Frequency)
• t 是时间(Time)
• ϕ 是相位偏移(Phase Shift)
二、采样率(Sample Rate, fs)
采样率是指每秒钟从连续信号中采集的样本数量,单位也是赫兹(Hz)。在数字音频中,模拟信号通过ADC(模数转换器)转换成数字信号时,采样率决定了数字信号能够精确表示原始模拟信号的程度。
三、两者之间的关系
根据奈奎斯特采样定理(Nyquist Theorem) ,为了能够无失真地从数字信号中重建原始的模拟信号,采样率必须至少是信号最高频率的两倍。这被称为奈奎斯特采样率:
fs ≥ 2fmax
其中:
• fs 是采样率
• fmax 是信号中的最高频率。对于单一频率的正弦波而言,其最高频率等于正弦波的频率。
如果采样率低于奈奎斯特率,就会发生混叠(Aliasing) ,即高频信号会错误地出现在低频区域,导致重建的信号失真。这将在后续文章中详细讨论。
四、举例
假设有一个正弦波信号,其频率为1000 Hz。为了无失真地数字化这个信号,我们需要选择一个采样率至少为2000 Hz(即每秒至少采集2000个样本)。常见的音频CD标准使用44100 Hz的采样率,这足以捕捉人类听觉范围内的所有声音(大约20 Hz到20 kHz)。
在实际应用中,通常会选择稍高于奈奎斯特率的采样率,以提供额外的安全余量,并使用抗混叠滤波器来进一步防止混叠现象。
五、生成相同采样率、不同频率正弦波的Python代码
下面给出一个生成并绘制相同采样率、不同频率正弦波的Python代码示例,并给出代码的结果。
# 导入numpy和matplotlib.pyplot库
import numpy as np
import matplotlib.pyplot as plt
# 步骤1:定义参数
A = 1 # 幅度
f1 = 1000 # 正弦波1的频率(赫兹)
f2 = 2000 # 正弦波2的频率(赫兹)
phi = 0 # 相位角,0°
duration = 1 #持续时间(秒)
fs = 44100 # 采样率(赫兹)
# 步骤2: 定义时间轴变量变量t
t = np.linspace(0, duration, int(fs * duration), endpoint=False) # 时间向量
# 步骤3:生成两个不同频率的正弦波
x1 = A * np.sin(2 * np.pi * f1 * t + phi)
x2 = A * np.sin(2 * np.pi * f2 * t + phi)
# 步骤4:画图
# 创建一个图形窗口
plt.figure(figsize=(12, 10))
# 使用subplot创建一个2行1列的子图布局,并选中第一个子图进行绘制
plt.subplot(2, 1, 1)
# 在第一个子图中绘制第一个正弦波
plt.plot(t, x1)
# 设置x轴和y轴的标签
plt.xlabel('Time (s)')
plt.ylabel('Amplitude')
# 设置子图的标题
plt.title('正弦波,f=1000Hz')
# 在图上添加网格线
plt.grid(True)
# 设置x轴的范围为0到5毫秒
plt.xlim(0, 0.005)
# 使用subplot选中第二个子图进行绘制
plt.subplot(2, 1, 2)
# 在第二个子图中绘制第二个正弦波
plt.plot(t, x2)
# 设置x轴和y轴的标签
plt.xlabel('Time (s)')
plt.ylabel('Amplitude')
# 设置子图的标题
plt.title('正弦波,f=2000Hz')
# 在图上添加网格线
plt.grid(True)
# 设置x轴的范围为0到5毫秒
plt.xlim(0, 0.005)
# 使用tight_layout自动调整子图参数,避免标签之间的重叠
plt.tight_layout()
# 显示绘制的图像
plt.show()
python

六、仿真结果及分析
以下是执行代码后画图的结果。

结果分析:
代码执行后,生成了两个子图,分别绘制了频率为1000Hz和频率为2000Hz的正弦波。在每个子图中,x轴的范围都被设置为0到5毫秒。
写在后面的话
这是《数字信号处理python示例》系列文章的第18篇。整个系列将使用python语言示例说明数字信号处理的基本原理与工程应用。给出的所有Python程序将努力做到简单且具有说明性。在数字信号处理的理论方面,将尽量避免数学上的推导与证明,而注重其物理意义阐述和工程应用的介绍。
感谢您的阅读!
