小波变换和傅立叶变换去噪对比,要求给出Matlab对应可运行代码
时间: 2023-07-22 22:15:20 浏览: 104
小波变换和傅立叶变换在信号去噪方面有着不同的优缺点。下面给出Matlab对应的代码实现。
首先,我们生成一个包含噪声的信号:
```matlab
t = linspace(0, 1, 1000);
x = sin(2*pi*10*t) + sin(2*pi*20*t) + sin(2*pi*30*t) + 0.5*randn(size(t));
```
其中,前三项是正弦信号,最后一项是高斯噪声。
使用傅立叶变换进行去噪:
```matlab
X = fft(x);
f = linspace(0, 1, length(x));
F = (abs(f-0.1)<0.05) | (abs(f-0.2)<0.05) | (abs(f-0.3)<0.05);
X(F) = 0;
y = ifft(X);
```
上述代码中,在频域上将10Hz、20Hz和30Hz的分量去除,然后再通过逆傅立叶变换将信号转回时域。此方法适用于对稳态信号进行去噪。
使用小波变换进行去噪:
```matlab
wname = 'db4';
[C, L] = wavedec(x, 4, wname);
thr = wthrmngr('dw2ddenoLVL', 'penalhi', C, L, 3);
xd = wdencmp('gbl', C, L, wname, 4, thr, 'h');
```
上述代码中,使用Daubechies-4小波对信号进行分解,选取第四层小波系数进行阈值处理,使用硬阈值法将小于一定阈值的系数置为0,再进行重构。此方法适用于对非稳态信号进行去噪。
完整的Matlab代码如下:
```matlab
% 生成包含噪声的信号
t = linspace(0, 1, 1000);
x = sin(2*pi*10*t) + sin(2*pi*20*t) + sin(2*pi*30*t) + 0.5*randn(size(t));
% 傅立叶变换去噪
X = fft(x);
f = linspace(0, 1, length(x));
F = (abs(f-0.1)<0.05) | (abs(f-0.2)<0.05) | (abs(f-0.3)<0.05);
X(F) = 0;
y1 = ifft(X);
% 小波变换去噪
wname = 'db4';
[C, L] = wavedec(x, 4, wname);
thr = wthrmngr('dw2ddenoLVL', 'penalhi', C, L, 3);
y2 = wdencmp('gbl', C, L, wname, 4, thr, 'h');
% 绘制结果
figure;
subplot(3,1,1);
plot(t, x);
title('Original Signal');
subplot(3,1,2);
plot(t, y1);
title('Fourier Transform Denoised Signal');
subplot(3,1,3);
plot(t, y2);
title('Wavelet Transform Denoised Signal');
```
阅读全文