杰瑞科技汇

Matlab信号处理教程从哪学起?

MATLAB 信号处理综合教程

目录

  1. 第一部分:MATLAB 信号处理基础

    Matlab信号处理教程从哪学起?-图1
    (图片来源网络,侵删)
    • 1 MATLAB 环境简介
    • 2 信号的表示:向量与矩阵
    • 3 创建基本信号
    • 4 信号的时域可视化(绘图)
    • 5 信号的读取与写入
  2. 第二部分:核心信号处理概念与函数

    • 1 连续时间 vs. 离散时间
    • 2 采样定理
    • 3 常用信号函数(sine, cosine, square, sawtooth
    • 4 常用序列函数(zeros, ones, rand, linspace
    • 5 卷积 (conv)
    • 6 相关性 (xcorr)
  3. 第三部分:傅里叶分析

    • 1 傅里叶变换的核心思想
    • 2 离散时间傅里叶变换 (DTFT)
    • 3 离散傅里叶变换 (DFT) 及其快速算法 (FFT)
    • 4 FFT 的实际应用与技巧
      • 4.1 计算单边频谱
      • 4.2 频率分辨率与补零
    • 5 频谱可视化 (plot, stem, pwelch)
  4. 第四部分:数字滤波器设计

    • 1 滤波器基础:低通、高通、带通、带阻
    • 2 IIR 滤波器(无限冲激响应)
      • 2.1 巴特沃斯滤波器设计 (butter)
      • 2.2 切比雪夫滤波器设计 (cheby1, cheby2)
    • 3 FIR 滤波器(有限冲激响应)
      • 3.1 窗函数法设计 (fir1)
    • 4 滤波器实现 (filter)
    • 5 滤波器分析 (freqz, grpdelay)
  5. 第五部分:实战项目

    Matlab信号处理教程从哪学起?-图2
    (图片来源网络,侵删)
    • 1 项目一:含噪信号的生成、滤波与分析
    • 2 项目二:音频信号处理(播放、录制、滤波)
  6. 第六部分:学习资源与进阶

    • 1 官方文档
    • 2 在线课程与书籍
    • 3 进阶方向

第一部分:MATLAB 信号处理基础

1 MATLAB 环境简介

MATLAB (MATrix LABoratory) 是一个强大的数值计算和可视化软件,其核心是矩阵运算,这使得它非常适合处理信号(通常表示为向量或矩阵)。

  • 命令行窗口:输入和执行命令。
  • 编辑器:编写和保存脚本(.m 文件)。
  • 工作区:显示当前所有变量及其信息。
  • 图形窗口:显示绘图结果。

2 信号的表示:向量与矩阵

在 MATLAB 中,信号被表示为向量(一维数组)。

  • 一维信号(如音频):一个行向量 x = [x1, x2, x3, ..., xN] 或列向量 x = [x1; x2; x3; ...; xN]
  • 多维信号(如图像):一个矩阵。
% 创建一个包含5个样本的信号
signal = [1, 2, 3, 4, 5];
disp(signal);

3 创建基本信号

创建一个频率为 50 Hz,持续时间为 1 秒的余弦信号。

Matlab信号处理教程从哪学起?-图3
(图片来源网络,侵删)
% 参数定义
fs = 1000;      % 采样频率,单位 Hz
f = 50;         % 信号频率,单位 Hz
T = 1;          % 信号持续时间,单位 秒
% 创建时间轴
% t 是一个从 0 开始,步长为 1/fs,直到 T 的行向量
t = 0 : 1/fs : T-1/fs; 
% 生成信号
x = cos(2 * pi * f * t);
% 查看信号的前10个点
disp(x(1:10));

4 信号的时域可视化(绘图)

使用 plot 函数绘制连续信号的波形。

% 绘制信号的前 50 个点
figure; % 创建一个新的图形窗口
plot(t(1:50), x(1:50));
% 添加标签和标题'50Hz 余弦信号 (前50个采样点)');
xlabel('时间');
ylabel('幅值');
grid on; % 添加网格

5 信号的读取与写入

对于真实世界的信号,通常需要从文件中读取。

  • 读取 .wav 音频文件
    [audio_data, fs] = audioread('my_audio.wav');
    % audio_data: 信号数据 (通常是双精度列向量)
    % fs: 采样频率
  • 写入 .wav 音频文件
    audiowrite('output_audio.wav', audio_data, fs);

第二部分:核心信号处理概念与函数

1 连续时间 vs. 离散时间

  • 连续时间信号:在时间上是连续的,如 x(t),计算机无法直接处理。
  • 离散时间信号:只在离散的时间点上有值,如 x[n],MATLAB 处理的就是这种信号,它是通过对连续信号采样得到的。

2 采样定理

为了避免混叠,采样频率 fs 必须大于信号最高频率 fmax 的两倍。 fs > 2 * fmax 这是信号处理中最基本也是最重要的规则。

3 常用信号函数

fs = 1000; t = 0:1/fs:1;
% 正弦波
x_sin = sin(2*pi*50*t);
% 方波
x_square = square(2*pi*50*t);
% 锯齿波
x_sawtooth = sawtooth(2*pi*50*t);
% 绘制对比
figure;
subplot(3,1,1); plot(t, x_sin); title('正弦波');
subplot(3,1,2); plot(t, x_square); title('方波');
subplot(3,1,3); plot(t, x_sawtooth); title('锯齿波');

4 常用序列函数

% 创建一个长度为 10 的全零向量
z = zeros(1, 10);
% 创建一个长度为 5 的全一向量
o = ones(1, 5);
% 创建一个长度为 100 的均匀分布随机向量
r = rand(1, 100);
% 创建一个从 0 到 2*pi,包含 100 个点的向量
l = linspace(0, 2*pi, 100);

5 卷积 (conv)

卷积是分析线性时不变系统的基础,在 MATLAB 中使用 conv 函数。

% 定义一个信号 x 和一个系统冲激响应 h
x = [1, 2, 3, 4];
h = [0.5, 1, 0.5];
% 计算卷积
y = conv(x, h);
% 绘制结果
figure;
subplot(3,1,1); stem(x); title('输入信号 x');
subplot(3,1,2); stem(h); title('冲激响应 h');
subplot(3,1,3); stem(y); title('输出信号 y = x * h');

6 相关性 (xcorr)

相关性用于衡量两个信号的相似度,或者查找信号与自身延迟版本的相似度(自相关)。

% 创建两个相似但有延迟的信号
x1 = cos(2*pi*10*(0:0.01:1));
x2 = [zeros(1,20), x1(1:end-20)]; % x2 是 x1 延迟了 20 个点
% 计算互相关
[c, lags] = xcorr(x1, x2);
% 找到相关性最大的延迟点
[max_corr, delay_idx] = max(abs(c));
delay_samples = lags(delay_idx);
figure;
plot(lags, c);'互相关');
xlabel('延迟 (样本数)');
ylabel('相关性');
grid on;
disp(['检测到的延迟为: ', num2str(delay_samples), ' 个样本。']);

第三部分:傅里叶分析

1 傅里叶变换的核心思想

傅里叶变换将信号从时域(幅值随时间变化)转换到频域(幅值随频率变化),它揭示了信号由哪些频率的正弦波组成。

2 离散时间傅里叶变换 与 离散傅里叶变换

DTFT 是理论工具,而 DFT 是可以在计算机上计算的实用工具,FFT 是 DFT 的一种快速算法,是现代信号处理的基石。

3 FFT 的实现 (fft)

% 创建一个含 50Hz 和 120Hz 分量的信号
fs = 1000;
t = 0:1/fs:1-1/fs;
x = 0.7*cos(2*pi*50*t) + 1.0*cos(2*pi*120*t);
% 计算 FFT
N = length(x); % 信号长度
X = fft(x);    % 计算复数频谱
% 计算频率轴
f = (0:N-1)*(fs/N);

4 FFT 的实际应用与技巧

4.1 计算单边频谱

FFT 的结果是双边的(对称的),对于实数信号,我们通常只关心单边频谱(0 到 fs/2)。

% 计算幅值谱
magnitude = abs(X);
% 取单边频谱
P2 = magnitude/N;       % 双边频谱幅值
P1 = P2(1:N/2+1);       % 单边频谱幅值
f1 = f(1:N/2+1);        % 单边频率轴
% 绘制单边幅值谱
figure;
plot(f1, 2*P1); % 乘以2以补偿能量(除了直流分量)'单边幅值谱');
xlabel('频率');
ylabel('幅值');
xlim([0 200]); % 只显示前200Hz,便于观察
grid on;

你会看到在 50Hz 和 120Hz 处有两个明显的峰值。

4.2 频率分辨率与补零

频率分辨率 df = fs / N,要提高分辨率(让频谱峰更细),需要增加信号长度 N 或降低采样率 fs补零:在信号末尾添加零,可以增加 FFT 的点数,使频谱曲线更平滑,但不能提高真实的频率分辨率。

% 原始信号
x_orig = cos(2*pi*50*(0:0.01:0.5));
N_orig = length(x_orig);
% 补零到 1024 点
N_fft = 1024;
x_padded = [x_orig, zeros(1, N_fft - N_orig)];
% 计算两个信号的FFT
X_orig = fft(x_orig);
X_padded = fft(x_padded);
% 绘制对比
figure;
subplot(2,1,1);
plot(abs(X_orig)/N_orig); title('原始FFT (N=51)');
xlim([0 100]);
subplot(2,1,2);
plot(abs(X_padded)/N_fft); title('补零后FFT (N=1024)');
xlim([0 100]);

你会看到补零后的频谱图更平滑,但峰值位置(频率)没有改变。

5 频谱可视化

  • plot:用于绘制平滑的连续频谱。
  • stem:用于绘制离散的频谱点。
  • pwelch:一种更高级的功率谱密度估计方法,可以减少频谱泄漏,效果通常比直接使用 fft 更好。
% 使用 pwelch 估计功率谱密度
figure;
pwelch(x, hamming(256), 128, 1024, fs);'PSD using pwelch');
xlabel('Frequency');
ylabel('Power/Frequency (dB/Hz)');

第四部分:数字滤波器设计

滤波器用于从信号中提取或去除特定频率的成分。

1 滤波器基础

  • 低通滤波器:允许低频通过,滤除高频。
  • 高通滤波器:允许高频通过,滤除低频。
  • 带通滤波器:允许一个特定频率范围的信号通过。
  • 带阻滤波器:阻止一个特定频率范围的信号通过。

2 IIR 滤波器

递归结构,有反馈,通常阶数较低,性能好,但可能存在相位失真。

2.1 巴特沃斯滤波器设计

设计一个截止频率为 100 Hz 的 4 阶低通巴特沃斯滤波器。

fs = 1000;          % 采样频率
fc = 100;           % 截止频率
order = 4;          % 滤波器阶数
% 归一化截止频率 (Nyquist频率 = fs/2)
Wn = fc / (fs/2);
% 设计滤波器
% [b, a] 分别是滤波器传递函数的分子和分母系数
[b, a] = butter(order, Wn, 'low');
% 分析滤波器频率响应
freqz(b, a, 1024, fs);'4阶巴特沃斯低通滤波器频率响应');

你会看到一个低通滤波器的特性曲线。

3 FIR 滤波器

非递归结构,无反馈,总是稳定的,且可以具有线性相位,但通常需要更高的阶数才能达到与 IIR 相同的性能。

3.1 窗函数法设计

设计一个截止频率为 100 Hz 的 50 阶低通 FIR 滤波器。

fs = 1000;
fc = 100;
order = 50; % 阶数 = 长度 - 1
% 归一化截止频率
Wn = fc / (fs/2);
% 使用窗函数法设计FIR滤波器
% b 是滤波器的系数
b = fir1(order, Wn, 'low', hamming(order+1));
% 分析滤波器频率响应
freqz(b, 1, 1024, fs); % FIR滤波器的分母系数a=1'50阶FIR低通滤波器频率响应 (窗函数法)');

4 滤波器实现 (filter)

使用设计好的 ba 系数对信号进行滤波。

% 创建一个含噪声的信号
f1 = 50; f2 = 200;
x_noisy = cos(2*pi*f1*t) + 0.8*cos(2*pi*f2*t) + 0.5*randn(size(t));
% 使用之前设计的IIR滤波器进行滤波
y_filtered_iir = filter(b, a, x_noisy);
% 绘制结果
figure;
subplot(3,1,1); plot(t, x_noisy); title('含噪信号');
subplot(3,1,2); plot(t, y_filtered_iir); title('IIR滤波后信号');
xlim([0 0.1]); % 只显示一小段以便观察
legend('位置', 'best');

你会看到滤波后的信号中,200Hz 的高频噪声成分被显著削弱了。

5 滤波器分析 (freqz, grpdelay)

  • freqz(b, a):绘制滤波器的幅频和相频响应。
  • grpdelay(b, a):绘制滤波器的群延迟,用于评估相位失真。

第五部分:实战项目

1 项目一:含噪信号的生成、滤波与分析

目标:生成一个 50Hz 的正弦信号,混入 200Hz 的噪声,设计滤波器去除噪声,并分析滤波前后的频谱。

%% 1. 信号生成
fs = 1000; t = 0:1/fs:1;
f_signal = 50; f_noise = 200;
x_clean = cos(2*pi*f_signal*t);
x_noisy = x_clean + 0.5*cos(2*pi*f_noise*t);
%% 2. 滤波器设计
fc = 100; order = 4;
Wn = fc / (fs/2);
[b, a] = butter(order, Wn, 'low');
%% 3. 信号滤波
y_filtered = filter(b, a, x_noisy);
%% 4. 结果分析与可视化
% 时域图
figure;
subplot(3,1,1); plot(t, x_clean); title('原始纯净信号'); xlim([0 0.1]);
subplot(3,1,2); plot(t, x_noisy); title('含噪信号'); xlim([0 0.1]);
subplot(3,1,3); plot(t, y_filtered); title('滤波后信号'); xlim([0 0.1]);
% 频域图
N = length(t);
f = (0:N-1)*(fs/N);
X_noisy_fft = fft(x_noisy);
Y_filtered_fft = fft(y_filtered);
P2_noisy = abs(X_noisy_fft)/N;
P1_noisy = P2_noisy(1:N/2+1);
P2_filtered = abs(Y_filtered_fft)/N;
P1_filtered = P2_filtered(1:N/2+1);
figure;
subplot(2,1,1); plot(f(1:N/2+1), 2*P1_noisy); title('含噪信号频谱');
subplot(2,1,2); plot(f(1:N/2+1), 2*P1_filtered); title('滤波后信号频谱');
xlabel('频率');

2 项目二:音频信号处理

目标:读取一段音频,为其添加低频噪声,然后设计高通滤波器去除噪声,并播放和保存处理后的音频。

%% 1. 读取音频
[original_audio, fs] = audioread('sample_audio.wav'); % 请确保有此文件
original_audio = original_audio(:,1); % 取单声道
% 模拟低频噪声 (e.g., 50Hz hum)
t = (0:length(original_audio)-1)' / fs;
noise = 0.2 * sin(2*pi*50*t);
noisy_audio = original_audio + noise;
%% 2. 设计高通滤波器
fc = 100; % 截止频率
order = 6;
Wn = fc / (fs/2);
[b_hp, a_hp] = butter(order, Wn, 'high');
%% 3. 滤波
denoised_audio = filter(b_hp, a_hp, noisy_audio);
%% 4. 播放和保存
% 播放
% sound(noisy_audio, fs);
% pause(length(noisy_audio)/fs);
% sound(denoised_audio, fs);
% 保存
audiowrite('noisy_audio.wav', noisy_audio, fs);
audiowrite('denoised_audio.wav', denoised_audio, fs);
% 绘制波形对比
figure;
subplot(3,1,1); plot(original_audio(1:2000)); title('原始音频');
subplot(3,1,2); plot(noisy_audio(1:2000)); title('含噪音频');
subplot(3,1,3); plot(denoised_audio(1:2000)); title('去噪后音频');

第六部分:学习资源与进阶

1 官方文档

MATLAB 的官方文档是最好的学习资源,内容权威、详尽且配有示例。

2 在线课程与书籍

  • 在线课程
    • Coursera, edX 上有众多关于信号处理和 MATLAB 的课程。
    • MathWorks 官网也有免费的视频教程。
  • 经典书籍
    • 《数字信号处理》(Proakis & Manolakis):理论经典。
    • 《信号处理与线性系统》(Oppenheim):另一本理论巨著。
    • 《MATLAB在信号处理中的应用》(张德丰等):侧重于 MATLAB 实现。

3 进阶方向

掌握基础后,可以探索以下领域:

  • 时频分析:小波变换 (cwt, dwt)。
  • 自适应滤波:LMS, RLS 算法。
  • 多速率信号处理:上采样、下采样。
  • 参数化谱估计:Yule-Walker, MUSIC 算法。
  • 机器学习在信号处理中的应用

希望这份教程能帮助你顺利入门 MATLAB 信号处理!最好的学习方式就是多动手实践,祝你学习愉快!

分享:
扫描分享到社交APP
上一篇
下一篇