MATLAB 信号滤波代码
时间: 2024-12-27 15:20:20 浏览: 1
### MATLAB 信号滤波示例代码
#### 维纳滤波
维纳滤波是一种用于去除噪声并恢复原始信号的有效方法。下面是一个简单的维纳滤波器实现:
```matlab
% 添加噪声到测试信号
original_signal = sin(2*pi*0.05*[0:99]);
noisy_signal = original_signal + randn(size(original_signal)) * 0.1;
% 使用 wiener2 函数进行滤波 (适用于二维数据, 这里仅作示意)
filtered_signal = wiener2(noisy_signal, [3 3]);
figure;
subplot(3,1,1);
plot(original_signal); title('Original Signal');
subplot(3,1,2);
plot(noisy_signal); title('Noisy Signal');
subplot(3,1,3);
plot(filtered_signal(:)); title('Filtered Signal using Wiener Filter');
```
对于一维信号,`wiener2` 不适用,应考虑其他形式的一维维纳滤波函数[^1]。
#### LMS 自适应滤波算法
LMS(最小均方误差)自适应滤波器能够动态调整其系数以优化性能。这里展示了一个基本的 LMS 实现方式:
```matlab
function y = lms_filter(x,d,mu,N)
% 初始化参数
w = zeros(N,1); % 初始权重向量
M = length(d)-N+1; % 输出长度
for k=1:M-N+1
u = x(k:k+N-1)'; % 输入样本窗口
e(k) = d(k) - w'*u; % 计算误差
w = w + mu*e(k)*u; % 更新权值
end
y = conv(w(end:-1:1),x,'valid'); % 应用最终训练好的滤波器
end
% 测试 LMS 滤波器
mu = 0.01; % 步长因子
N = 8; % 滤波器阶数
d = cos(pi/4*(0:length(x)-1)); % 目标信号
y = lms_filter(x,d,mu,N);
figure;
plot(y); title('Output of LMS Adaptive Filter');
```
请注意,在实际应用中可能需要更复杂的初始化和其他细节设置。
#### 小波变换滤波
小波变换提供了多分辨率分析的能力,非常适合于非平稳信号处理。此部分给出一个小波去噪的例子:
```matlab
load noisdopp.mat % 加载含噪信号
[c,l] = wavedec(noisdopp,4,'db4'); % 分解至第四层
thr = mtlb_wden(c,l,'s','mln',4,'db4'); % 软阈值化
cleaned_sig = waverec(c,l,'db4'); % 重构信号
figure;
subplot(2,1,1);
plot(noisdopp); title('Noisy Doppler Signal');
subplot(2,1,2);
plot(cleaned_sig); title('Denoised by Wavelet Transform');
```
上述例子展示了如何利用 Daubechies 波基(`'db4'`)执行四级分解,并通过软阈值法减少高频分量中的噪音。
阅读全文