学贵有恒

方有所成

导航

香农采样定律

香农采样定理(Shannon Sampling Theorem),也称为奈奎斯特-香农采样定理(Nyquist-Shannon Sampling Theorem),是信号处理领域的基础理论,定义了连续信号转换为离散信号时的最低采样频率要求,以确保信号能够被完整、无失真地重建。

定理内容

采样频率(fsfs)必须至少是信号中最高频率(fmaxfmax)的两倍,即:

fs≥2⋅fmaxfs2fmax

这一最低采样频率 2⋅fmax2fmax 被称为奈奎斯特频率(Nyquist Rate)。若低于此频率,会导致混叠(Aliasing)现象,即高频信号被错误地重建为低频信号。


关键概念

  1. 信号带宽
    信号中最高有效频率分量 fmaxfmax 决定了信号的带宽。例如,音频信号带宽通常为 20 Hz - 20 kHz,最高频率 fmax=20 kHzfmax=20 kHz。

  2. 采样频率选择

    • 例如,CD 音频的采样频率为 44.1 kHz(略高于 2 × 20 kHz),以满足人耳听觉需求。

    • 实际应用中,常选择 fs=2.2⋅fmaxfs=2.2fmax 以留出安全余量。

  3. 混叠(Aliasing)
    当 fs<2fmaxfs<2fmax 时,高频成分在采样后会被“折叠”到低频区域,导致信号失真。例如,车轮在视频中看似反向旋转即为混叠现象。

  4. 抗混叠滤波器
    采样前需使用低通滤波器滤除高于 fs/2fs/2 的频率成分,避免混叠。


数学解释

  • 连续信号 x(t)x(t) 的傅里叶变换为 X(f)X(f),其频谱在 ∣f∣≤fmaxffmax 外为零。

  • 以 fs≥2fmaxfs2fmax 采样后,离散信号频谱为原始频谱的周期性延拓,且无重叠。

  • 通过理想低通滤波器(如 sinc 函数插值)可完美重建原始信号。


应用领域

  1. 数字通信:调制解调、信道编码。

  2. 音频处理:CD、数字录音。

  3. 图像处理:数码相机采样、图像压缩。

  4. 医学成像:MRI、CT 扫描信号重建。


注意事项

  • 实际信号的非理想性:真实信号可能包含高频噪声,需通过抗混叠滤波器预处理。

  • 非带限信号:若信号频率范围无限(如方波),需先滤波限制带宽。


香农采样定理是数字信号处理的基石,确保模拟世界到数字世界的高保真转换。理解并正确应用该定理,对避免信息丢失和信号失真至关重要。

 

 

 

香农采样C语言实现
 

#include <stdio.h>
#include <math.h>

// 信号参数
#define SIGNAL_FREQ 50 // 信号频率 (Hz)
#define AMPLITUDE 1.0 // 信号幅值
#define SAMPLE_RATE 1000 // 采样频率 (Hz),需满足香农定理:SAMPLE_RATE > 2*SIGNAL_FREQ

// 生成连续信号(示例为正弦波)
double generate_signal(double t) {
return AMPLITUDE * sin(2 * M_PI * SIGNAL_FREQ * t);
}

int main() {
double duration = 0.02; // 采样时长 (秒)
int num_samples = (int)(duration * SAMPLE_RATE); // 总采样点数
double sampling_interval = 1.0 / SAMPLE_RATE; // 采样间隔

printf("开始采样...\n");
printf("采样频率: %d Hz, 信号频率: %d Hz\n", SAMPLE_RATE, SIGNAL_FREQ);
printf("总采样点数: %d\n\n", num_samples);

// 执行采样并输出结果
for (int i = 0; i < num_samples; i++)

{
double t = i * sampling_interval; // 当前采样时间
double sample = generate_signal(t); // 获取采样值

// 输出采样结果(可替换为存储到数组或文件)
printf("t=%.4f s, 采样值=%.4f\n", t, sample);
}

return 0;
}

 

代码说明:

  1. 参数定义

    • SIGNAL_FREQ:被采样信号的频率(50Hz)

    • SAMPLE_RATE:采样频率(1000Hz),满足香农定理(>2×50Hz)

    • AMPLITUDE:信号幅值

  2. 信号生成

    • generate_signal() 函数生成一个正弦波信号,可根据需求修改为其他信号

  3. 采样过程

    • 计算总采样点数 num_samples

    • 通过循环在等间隔时间点采集信号值

    • 输出采样时间和对应的信号值

运行结果示例:

 
 
复制
 
下载
开始采样...
采样频率: 1000 Hz, 信号频率: 50 Hz
总采样点数: 20

t=0.0000 s, 采样值=0.0000
t=0.0010 s, 采样值=0.3090
t=0.0020 s, 采样值=0.5878
...
t=0.0190 s, 采样值=-0.5878

关键点:

  1. 采样率选择:确保 SAMPLE_RATE > 2×SIGNAL_FREQ,本例中1000Hz远高于最低要求100Hz

  2. 信号扩展:可修改 generate_signal() 函数生成方波、三角波等信号

  3. 实际应用

    • 将输出保存到文件(如CSV)用于后续分析

    • 添加抗混叠滤波器(模拟前端低通滤波)

    • 通过FFT实现频谱分析验证采样效果

验证香农定理:

尝试修改 SAMPLE_RATE 为低于100Hz(如80Hz),观察采样后的信号会出现频率混叠现象。

这个示例展示了香农采样定理的核心实现,实际工程中还需考虑量化、抗混叠滤波、重构等更多环节。

 
 
 
 
 

posted on 2025-05-21 09:07  CarryBricks  阅读(473)  评论(0)    收藏  举报