备注:所有代码均为原创,若需要代码请联系yifeiwans@stu.xmu.edu.cn.希望对大家有帮助,熬夜写文章,希望大家不要白嫖。给个赞,以后会更新。
1.序言
目前,CSDN以及PUDN论坛上的代码,很少关于PCA进行信号滤波以及信号去噪的,而大多数关于用PCA降维处理.自己也搜了半天的文章发现只有完美的理论讲解,也没有相关的代码。我就根据PCA原理结合高斯白噪声,写了关于PCA去噪方法以及MATLAB代码:正弦信号+高斯白噪声通过PCA方法去除高斯白噪声,还原一维正弦信号。
PCA去噪相关原理大家可以看这篇文章:PCA进行信号滤波https://www.cnblogs.com/bjwu/p/8970823.html
2.PCA原理(待补充)
3.PCA计算步骤(待补充)
4.MATLAB代码实现
为了与文章相贴合我们采用推荐文章中给的信号例子:三个频率不同且幅值相位不相同的余弦函数之和,20,30,50HZ,幅值分别为1,2,3。噪声信号为高斯白噪声,我们现在要用主成分分析将高斯白噪声从x(t)中滤掉。
4.1噪声模型
其中噪声方差分为取0.1,1以及5来验证算法有效性,MATLAB噪声代码是
noise=0.1*randn(size(st1));
noise=0.1*randn(size(st1)); %方差0.1
noise=1*randn(size(st1)); %方差1
noise=5*randn(size(st1)); %方差5
4.2 仿真结果
从三种不同噪声方差下可以看出,噪声小的可以完全恢复出信号,随着噪声功率增加PCA信号恢复出现失真。具体的大家可以做出SNR图来观看。
clc;clear all;close all
%% Simulate data
dt=0.001;
t=0:dt:1-dt;
st=1*cos(2*pi*20*t)+2*cos(2*pi*30*t)+1*cos(2*pi*50*t);
% 20 30,50HZ,幅值分别为1,2 3
sigma=0.1;%噪声方差0.1 1 5
%%PCA函数代码已经隐藏,希望大家不要白嫖可以联系我286820790或邮箱286920790@qq.com
[eig_ts, V,S,N]=PCA_denoising(st,sigma) ;
%% Plotting time
% time series
figure(1)
% subplot(2,1,2)
plot(t,eig_ts/10,"r-")
hold on;
plot(t,st,"b.")
xlabel('Time (norm.)')
title('噪声方差0.1')
legend({'PCA恢复 ';'原始信号'})
zoom on