by 今天不飞了
课代表想生成一个单点衰减曲线(信号),对其加入噪声后,测试各种平滑算法的效果。
好了,你看看是不是你想要的的。
生成单点衰减曲线
我也不懂啥叫单点衰减曲线,但是只要有表达式,就能给你整出来
x ( t ) = C τ ∑ n = 1 + ∞ e x p ( − n 2 t τ ) x(t) =\frac{C}{\tau} \sum_{n=1}^{+\infty} exp(-\frac{n^2t}{\tau}) x(t)=τCn=1∑+∞exp(−τn2t)
我们注意到这里的求和符号直接拉满,干到
+
∞
+\infty
+∞,这……
由于数学功底不行,不知道怎么搞,只能想到如下方法
我们画出
f
(
x
)
=
e
x
p
(
−
x
)
f(x) = exp(-x)
f(x)=exp(−x) 的曲线,发现
x
<
−
10
x<-10
x<−10 基本都等于0了,所以我们加到
x
=
−
10
x=-10
x=−10 就行了。
由
−
n
2
t
/
τ
=
x
>
−
10
-n^2t/\tau =x>-10
−n2t/τ=x>−10 ,得
n
<
10
τ
/
t
n <\sqrt{10\tau/t}
n<10τ/t
那么我们用for循环来完成求和部分,如下
function out = kernel(t,tao)
N = floor(sqrt(10*tao/t));
out = 0;
for n = 1:N
out = out+exp(-n^2*t/tao);
end
end
当然循环可以用矩阵运算替换
function out = kernel(t,tao)
N = floor(sqrt(10*tao/t));
n = 1:N;
out = exp(-n.^2/t/tao)
end
接下来就可以生成单点衰减曲线了
%% 生成衰减信号
% 设置参数
iter = 0.1;
T = iter:iter:10;
C = 10;
tao = 1;
% 生成
signalLen = length(T);
signal = zeros(signalLen,1);
for n = 1:signalLen
signal(n) = C/tao*kernel(T(n),tao);
end
figure
plot(signal),title('衰减信号')
原来就长这个样
添加噪声并平滑
噪声我就简单实用高斯白噪声了啊,参数你自己搞。平滑对比
%% 加入噪声
a = 0;
b = 0.1;
noise = a + b .* randn(signalLen,1);
signalNoise = signal+noise;
figure
subplot(311),plot(signal),title('原始信号')
subplot(312),plot(noise),title('噪声')
subplot(313),plot(signalNoise),title('含噪声信号')
%% 滤波
% FIR滤波
b = fir1(31,0.4,kaiser(32,4.55))';
s1 = filtfilt(b,1,signalNoise);
% 中值滤波
s2 = medfilt1(signalNoise,5);
% 均值滤波
s3 = conv(signalNoise,fspecial('average',[1,5]),'same');
s3(1:2) = signalNoise(1:2);
figure
subplot(411),plot(signalNoise),title('含噪声信号')
subplot(412),plot(s1),title('FIR滤波')
subplot(413),plot(s2),title('中值滤波')
subplot(414),plot(s3),title('均值滤波')
% 频谱
f0 = abs(fftshift(fft(signalNoise)));
f1 = abs(fftshift(fft(s1)));
f2 = abs(fftshift(fft(s2)));
f3 = abs(fftshift(fft(s3)));
figure
subplot(411),plot(f0),title('含噪声信号频谱')
subplot(412),plot(f1),title('FIR滤波后频谱')
subplot(413),plot(f2),title('中值滤波后频谱')
subplot(414),plot(f3),title('均值滤波后频谱')
结果如下
其他
课代表还有其他问题吗?反正问了我也不会回答。