脉搏波信号处理
%信号采样
N = 256;fs = fr;
data = data(1:N);
n = 1:N;
t = n/fs;
plot(t,data);
- 首先,我们将原始一维脉搏波信号做256点的采样,以便其方便fft计算。采样频率和原信号的频率一样均为30hz。
y=fft(data,N); %对信号进行快速Fourier变换
mag=abs(y); %求得Fourier变换后的振幅
f=n*fs/N; %频率序列
figure, plot(f,mag); %绘出随频率变化的振幅
xlabel('频率/Hz');
ylabel('振幅');title('N=256');grid on;
- 求出原始信号的频谱,由于脉搏信号的频率大约在42bps-180bps之间,也就是0.7hz-3.0hz。在这个频率区间之外的可以认定为噪声,所以接下来需要一个带通滤波器来滤除噪声。
- 这里采样巴特沃兹带通滤波,其通带范围fp是[0.7,3.5],阻带截至[0.5 5]。要求带边频率衰减<=3db; 0.5hz以下5hz以上衰减>=18db (10^(-3/20)=0.707; 10^(-18/20)=0.125 )。
fp=[0.7 3.5];fs=[0.5 5];
rp=3;rs=18;
Fs=30;
wp=fp*2*pi/Fs;ws=fs*2*pi/Fs;
[n,wn]=buttord(wp/pi,ws/pi,rp,rs);
[b,a]=butter(n,wp/pi);
[h,w]=freqz(b,a,256,Fs);
figure;
plot(w,abs(h));grid;
ylabel('Bandpass DF') ;
xlabel('Hz');
- 滤波去频率响应如上图所示,可见其基本符合设计要求。
- 接下来将原始信号用所设计的滤波器进行滤波,matlab中,只需要知道滤波器分子分母系数,就可以用filter函数直接进行滤波了。
% 滤波器滤波
nData=filter(b,a,data);
nDataAbs = abs(fft(nData, 256));
figure; plot(f, nDataAbs);
figure; plot(nData);
- 画出了滤波信号的频谱图和原始数据,可见其已经达到了滤波要求。