SVD去噪

标签:
matlabsvd |
分类: matlab |
博主最近在研究SVD算法,看到了有人拿这个算法去噪,自己也去试了一下。MATLAB里有编好的函数svd来实现奇异值分解(不过你edit svd,会发现只有几行注释语句,这应该是matlab公司的版权保护,不让外人知道算法程序是如何编写的),所以用SVD去噪也是很容易实现的。
clear all;t=0:0.1:20;
x= 10.*sin(t)+5.*cos(2.*t);%构造一个原始信号
noise=unifrnd(-1,1,1,201);%构造噪声
y1=reshape(y,3,67);%信号y只有1行,没法进行SVD分解,所以先改变一下形状
[u s v]=svd(y1);%对y1进行SVD分解,s为包含奇异值的矩阵;
s1=s;s1(3,3)=0;%令第三个奇异值为0,u,v也要相应变化
u1=u;u1(3,3)=0;
v1=v;v1(3,3)=0;
y2=u1*s1*v1';%重构信号,注意这里乘的是v1的转置
y2=reshape(y2,1,201);%不要忘了reshape一下
plot(t,noise,'r',t,y2-x,'k')%画出真实的noise和SVD去掉的'噪声'的对比图