Advertisement

数字信号处理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
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-19/sFCtRG4LrVfqHdy1oJ3Tcgu7OA9Z.png)

六、仿真结果及分析

以下是执行代码后画图的结果。
在这里插入图片描述

结果分析:
代码执行后,生成了两个子图,分别绘制了频率为1000Hz和频率为2000Hz的正弦波。在每个子图中,x轴的范围都被设置为0到5毫秒。

写在后面的话

这是《数字信号处理python示例》系列文章的第18篇。整个系列将使用python语言示例说明数字信号处理的基本原理与工程应用。给出的所有Python程序将努力做到简单且具有说明性。在数字信号处理的理论方面,将尽量避免数学上的推导与证明,而注重其物理意义阐述和工程应用的介绍。

感谢您的阅读!



全部评论 (0)

还没有任何评论哟~