【MATLAB】对连续信号采样的研究

注意:MATLAB源码会在文章最后提供

某些重要概念

信号频率 / F (单位:Hz)

在电子电路设计以及通信系统里,通常将 3MHz 作为高频和低频的大致分界线。频率低于 3MHz 的为低频信号,高于 3MHz 的视作高频信号。例如,调幅(AM)广播的频率范围在 535kHz - 1605kHz ,属于低频段;而调频(FM)广播的频率范围在 88MHz - 108MHz,则处于高频段。

采样频率 / Fs (单位:Hz)

  • **定义:**采样频率指的是单位时间内对连续信号进行采样的次数,单位为赫兹(Hz)。比如采样频率为 100Hz,就意味着每秒对连续信号进行 100 次采样。
  • **作用:**决定了离散信号对原始连续信号的还原程度。通过在时间上对连续信号进行等间隔采样,将其转化为离散的样本序列。较高的采样频率可以获取更多的信号细节信息,使得离散信号更接近原始连续信号;而较低的采样频率可能会丢失一些重要信息,导致还原的信号与原始信号存在较大差异。
  • **奈奎斯特采样定理:**为了能够从采样后的离散信号无失真地恢复出原始连续信号,采样频率必须至少是原始信号最高频率的两倍。例如,对于最高频率为 20kHz 的音频信号,根据奈奎斯特采样定理,采样频率至少要达到 40kHz。理论上可以恢复原始信号,但在实际应用中,这种临界情况非常不稳定,信号稍有干扰或频率偏差,就可能无法准确恢复原始信号。

采样周期(间隔) / Ts (单位:s)

  • 定义: 采样周期指的是在对连续信号进行采样时,相邻两次采样之间的时间间隔 ,通常用 Ts表示。例如,当我们以固定的时间间隔对一个连续变化的电压信号进行取值,这个时间间隔就是采样周期。
  • 与采样频率关系: 采样周期与采样频率Fs 互为倒数,即Ts=1/Fs。比如采样频率 ,意味着每秒采样 1000 次,那么采样周期 ,也就是每隔 1 毫秒进行一次采样。
  • **对信号采样影响:**采样周期决定了采集到的离散信号对原始连续信号的时间分辨率。较小的采样周期(即较高的采样频率)能够更频繁地对连续信号进行采样,从而获取更多的信号细节,离散信号也就更接近原始连续信号的真实形态。相反,较大的采样周期(较低的采样频率)会使采样点在时间上分布稀疏,可能会丢失原始信号中的一些快速变化信息,导致信号还原时出现失真。例如,对一个频率较高的正弦波信号采样,如果采样周期过大,采集到的离散点可能无法准确描绘出正弦波的形状,出现波形失真。

采样总时间

公式:采样时长 = 采样周期 * 周期数

采样点数 / Ns (单位:个)

  • 定义:采样点数指的是在对连续信号进行采样的过程中,所获取的离散样本的数量 。比如,对一段持续 10 秒的声音信号进行采样,总共采集了 441000 个样本数据,这里的 441000 就是采样点数。
  • 计算公式:
    1、
    单个周期采样点数 = 信号周期÷采样周期 = 信号周期×采样频率 = 采样频率÷信号频率
    2、 采样点数 = 信号周期÷采样周期*采样时长 = 信号周期×采样频率*采样时长 = 采样频率÷信号频率*采样时长
    注意区别!!
  • 决定因素:
    1、采样时长: 在采样频率固定的情况下,采样时长越长,采样点数越多。例如,以 100Hz 的采样频率对信号采样 1 秒,采样点数为 100 个;若采样时长变为 2 秒,采样点数则变为 200 个。
    **2、采样频率:**当采样时长固定时,采样频率越高,单位时间内采集的样本数越多,采样点数也就越多。比如,对频率为 100Hz、周期为 1/100 秒 的信号进行采样,采样频率为 200Hz 时,采样点数是 2 个;若采样频率提高到 1000Hz,采样点数就变为 10 个。
  • 对信号分析的影响:采样点数影响着我们对信号的分析和处理效果。较多的采样点数可以提供更丰富的信号细节信息,有助于更精确地还原原始信号、进行频谱分析等操作。例如在频谱分析中,足够多的采样点数能让频谱图的分辨率更高,我们可以更清晰地分辨出信号中不同频率成分的分布情况。而采样点数过少,可能会丢失信号的关键特征,导致对信号的分析出现偏差。
  • 举例: 若有一个 1000Hz 的原始信号,用 2000 Hz的采样频率对这个信号进行采样,得出来的采样信号,其一个周期内只有 2 个采样点数,假如想要进行1024个点的FFT,那么对原始信号多采样几个周期,以加长采样时间,直到 Ns = fs / f * T = 1024 个点后,再进行FFT。因此,采样所得信号在单个周期内的点数,与进行FFT运算时所采用的点数(例如1024点)并不矛盾。在编程实现中,通常会定义一个大小为1024的DMA数组。DMA会持续不断地对ADC采集到的信号数据进行搬运,直至数组中的数据点数达到1024个,此时程序便会启动FFT运算,进而得到相应的频谱图,然后再进行下一次的搬运、FFT。 需要特别注意的是,在选择采样频率对原始信号进行采样时,若能使采样信号一个周期的采样点数 = 采样频率÷原始信号频率 = 2^n"这一关系,将有助于FFT运算取得更理想的效果。这是一个极易产生混淆的关键环节,务必加以留意!!!

采样频率分辨率 / ΔF (单位:Hz)

  • **定义:**频率分辨率指的是在对信号进行频谱分析时,能够分辨出的两个相邻频率分量的最小频率间隔 。简单来说,如果信号中存在两个频率相近的成分,频率分辨率决定了能否将它们清晰地区分开来。
  • **计算公式:**采样频率分辨率 = 采样频率 / 采样点数
  • 决定因素:在使用离散傅里叶变换(DFT)或快速傅里叶变换(FFT)等方法进行频谱分析时,频率分辨率主要取决于信号的采样点数Ns和采样频率Fs。在采样频率固定的情况下,采样点数越多,频率分辨率越高,即能分辨出更小的频率间隔,精度越高;反之,精度越低。例如,采样频率为 1000Hz,若采样点数为 1000 个,则能区分出频率间隔为 1Hz 的两个信号成分。
  • 对信号分析的影响:频率分辨率直接影响对信号频率特性的分析精度。在实际应用中,如在通信系统中分析信号频谱以避免干扰,或在音频处理中精确识别不同频率的声音成分,足够高的频率分辨率至关重要。若频率分辨率不足,可能会导致两个相邻频率的信号被误认为是一个信号,丢失重要信息;而过高的频率分辨率又可能引入不必要的数据量和计算复杂度。

MATLAB绘制举例

信号产生

首先产生一个信号频率为 50Hz 的信号,显示 5 个周期的时间长度。

产生如下的信号:

信号采样

采用不同的采样频率来采样原始信号,并生成采样信号,同样的,也是采样 5 个周期的时间。

产生如下几个采样后的信号:

对比一下原始信号:

这里我就没有用点点来表示所采样到的点数,但是根据计算公式也可以得知了,想要清楚看到采样点数的话,可以在plot函数中增加一个'rp'来显示采样点:

可见,根据**奈奎斯特采样定理:**采样频率至少是原始信号最高频率的两倍,当采样率为100Hz的时候,才能勉强还原出原始信号的形状以及所采样的 5 个周期,但这是处于奈奎斯特采样定理的临界情况。虽然理论上可以恢复原始信号,但在实际应用中,这种临界情况非常不稳定,信号稍有干扰或频率偏差,就可能无法准确恢复原始信号。实际应用中通常会采用更高的采样频率,以确保可靠地还原信号。

干扰测试

此处我加上了高斯白噪声,来测试不同的采样频率得出的采样信号,在同一噪声干扰下的稳定性如何。

绘制出来的图像:

这样就可以直观地看到干扰对采样信号的影响,同时对比不同采样率下受干扰信号的表现。例如,较高采样率下的信号可能在噪声干扰下仍能较好地保留原始信号的特征;而较低采样率下可能受噪声影响更明显,原始信号特征更难分辨,以此证明采样率和噪声对信号的影响。

MATLAB源码

Matlab 复制代码
%% 清除工作区变量、命令行窗口并关闭所有图形窗口
clear;
clc;
close all;

%% 信号生成与绘制
% 产生一个频率为50Hz、时长为5个周期时间的信号
f = 50; % 信号频率,单位:Hz
Tf = 1 / f; % 一个周期的时间,单位:s
N = 5; % 周期数目,单位:个
t1 = linspace(0 * Tf, N * Tf, N * 8192); %显示信号的n*Tf - 0*Tf个周期,每个周期有N个点
y1 = 5 * sin(f * 2 * pi * t1);

% 绘制原始信号
figure(1);
subplot(6, 2, 1);
plot(t1, y1);
title([[num2str(f), 'Hz原始信号']]);
xlabel('时间 / s');
ylabel('振幅 / V');
grid on;

%% 不同采样频率下的采样信号生成与绘制
% 采样频率数组
fs_array = [50, 100, 1000, 2000, 5000];

% 绘制采样后的信号
for i = 1:length(fs_array) %循环采样频率数组个数的次数
    fs = fs_array(i); %采样频率/Hz
    Ts = 1 / fs; %采样周期/s
    Ns = Tf / Ts; %采样点数/个 = 信号周期/采样周期 = 信号周期*采样频率 = 采样频率 / 信号频率
    t2 = linspace(0 * Tf, N * Tf, N * Ns);  %采样信号的n*Tf - 0*Tf个周期,每个周期采样N个点
    y2 = 5 * sin(f * 2 * pi * t2);

    subplot(length(fs_array) + 1, 2, 2 * i - 1 + 2);
    %plot(t2, y2,'rp');
    plot(t2, y2);
    title([num2str(fs), 'Hz采样率采样信号']);
    xlabel('时间 / s');
    ylabel('振幅 / V');
    grid on;
end

%% 给所有信号添加高斯白噪声干扰并绘制
noise_power = 0.5; % 噪声功率,可以根据需要调整

% 给原始信号添加噪声并绘制
noise1 = sqrt(noise_power) * randn(size(y1));
y1_with_noise = y1 + noise1;
subplot(6, 2, 2);
plot(t1, y1_with_noise);
title([num2str(f), 'Hz原始信号 +高斯白噪声干扰']);
xlabel('时间 / s');
ylabel('振幅 / V');
grid on;

% 给采样信号添加噪声并绘制
for i = 1:length(fs_array) %循环采样频率数组个数的次数
    fs = fs_array(i); %采样频率/Hz
    Ts = 1 / fs; %采样周期/s
    Ns = Tf / Ts; %采样点数/个 = 信号周期/采样周期 = 信号周期*采样频率 = 采样频率 / 信号频率
    t2 = linspace(0 * Tf, N * Tf, N * Ns);  %采样信号的n*Tf - 0*Tf个周期,每个周期采样N个点
    y2 = 5 * sin(f * 2 * pi * t2); %将y改为y2
    noise = sqrt(noise_power) * randn(size(y2));
    y2_with_noise = y2 + noise;

    subplot(length(fs_array) + 1, 2, 2 * i + 2);
    plot(t2, y2_with_noise);
    title([num2str(fs), 'Hz采样率采样信号 +高斯白噪声干扰']);
    xlabel('时间 / s');
    ylabel('振幅 / V');
    grid on;
end

%% 总结
%
% 奈奎斯特采样定理要求采样频率至少是原始信号最高频率的两倍。
% 这里原始信号频率50Hz,采样频率100Hz时刚好满足fs = 2f,处于奈奎斯特采样定理的临界情况。
% 虽然理论上可以恢复原始信号,但在实际应用中,这种临界情况非常不稳定,信号稍有干扰或频率偏差,就可能无法准确恢复原始信号。
% 实际应用中通常会采用更高的采样频率,以确保可靠地还原信号。
%
% 将噪声分别加到对应的采样信号上,得到 y2_with_noise,并绘制出含干扰的采样信号。
% 这样就可以直观地看到干扰对采样信号的影响,同时对比不同采样率下受干扰信号的表现。
% 例如,较高采样率(1000Hz)下的信号可能在噪声干扰下仍能较好地保留原始信号的特征;
% 而较低采样率(100Hz)下可能受噪声影响更明显,原始信号特征更难分辨,以此证明采样率和噪声对信号的影响。
相关推荐
机器学习之心4 小时前
NGO-VMD北方苍鹰算法优化变分模态分解+皮尔逊系数+小波阈值降噪+信号重构,MATLAB代码
算法·matlab·重构·信号重构·ngo-vmd·皮尔逊系数·小波阈值降噪
简简单单做算法6 小时前
基于球面透视投影模型的鱼眼图像校正算法matlab仿真
matlab·球面透视投影·鱼眼图像校正
fie888914 小时前
基于MATLAB实现的Elman神经网络用于电力负载预测
神经网络·机器学习·matlab
fie888919 小时前
基于MATLAB的狼群算法实现
开发语言·算法·matlab
gihigo199819 小时前
MATLAB中生成混淆矩阵
开发语言·matlab·矩阵
kaikaile19951 天前
基于MATLAB的传统插值法实现超分辨率重建
人工智能·matlab·超分辨率重建
wearegogog1231 天前
基于MATLAB的谷物颗粒计数方法
开发语言·matlab
MATLAB代码顾问1 天前
多种时间序列预测算法的MATLAB实现
开发语言·算法·matlab
yong99901 天前
MATLAB实现DLT645协议
开发语言·matlab
foundbug9991 天前
基于MATLAB绘制CALIPSO Level 2产品中体积退偏比垂直廓线和频率分布直方图
开发语言·matlab