EMG信号的低通滤波器的matlab仿真实现
Posted fpga和matlab
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EMG信号的低通滤波器的matlab仿真实现相关的知识,希望对你有一定的参考价值。
目录
一、理论基础
1.1巴特沃斯滤波器
MATLAB函数“emg_sim()”:编写一个MATLAB功能,模拟以2048 Hz采样的emg信号。函数的输入应为模拟持续时间(秒)。第二个输入应用于指定相对于“干净”肌电信号RMS值的电力线干扰幅度。在包含60 Hz干扰之前,函数的一个输出应为模拟EMG向量(见下文)。该函数的另一个输出应该是模拟EMG向量,包括60 Hz干扰。如果您选择,可以使用其他参数。要模拟肌电信号,首先使用MATLAB函数“randn()”创建一个独立的零均值高斯随机向量。在使用rand()生成器之前,请确保使用系统时钟随机地对其进行状态(也称为“种子”/“状态”)。[请参见MATLAB帮助页中的randn(),以找到一个单行命令。]其次,设计一个截止频率为150 Hz的二阶低通巴特沃斯滤波器。第三,将随机序列通过巴特沃斯滤波器。这样做可以塑造随机序列,使其看起来像一个持续努力的肌电信号,其频谱类似于上图。第四,将适当缩放的60 Hz正弦波添加到信号中(以模拟电力线干扰)。第五,注意巴特沃斯过滤器将有一个与之相关的启动瞬态。这种瞬态降低了模拟的保真度。因此,由randn()创建的初始随机序列的长度必须等于所需的EMG序列长度加上启动瞬态的长度。在第五步中,“切断”第四阶段序列的启动瞬态。您的模拟已完成。注意,EMG信号的绝对缩放对于这个问题并不重要。仅EMG信号相对于60Hz干扰的相对振幅。由于肌电信号是随机的,通常最好将60 Hz干扰的幅度缩放到模拟“干净”肌电的RMS值(低通滤波后)。
使用matlab中自带的randn函数产生一组随机数,作为EMG信号,然后EMG信号的采样率为2048hz。这里随机数产生的随机数种子采用的机遇系统时钟的随机数种子。系统输入有两个,一个是仿真时间,单位为s,一个是干扰值,输出有两个,一个为EMG信号,一格式带60hz正弦干扰的EMG信号。系统的设计步骤如下所示:
首先使用randn产生一组随机数,然后设计一个低通的巴特沃斯滤波器,其截止频率为150hz,将建立的随机数EMG信号输入到巴特沃斯滤波器。再将滤波得到的信号添加一个60hz的sin信号作为干扰。从而实现函数一个主要功能。
由于信号只保留EMG信号中的150hz,而对于150hz之外的频率信号需要滤除,巴特沃斯(Butterworth)滤波器是一种具有最大平坦幅度响应的低通滤波器,它在通信领域里已有广泛应用,在电测中也具有广泛的用途,可以作检测信号的滤波器。
巴特沃斯低通滤波器的平方幅度响应为:
其中,n为滤波器的阶数,为低通滤波器的截止频率。在matlab中使用buttord和butter来设计巴特沃斯滤波器。buttord函数可在给定滤波器性能的情况下,选择巴特沃斯滤波器的阶数n和截止频率,从而可利用butter函数设计巴特沃斯滤波器的传递函数。
1.2 陷波器
陷波器是一种特殊的带阻滤波器,其阻带在理想情况下只有一个频率点,因此也被称为点阻滤波器。这种滤波器主要用于消除某个特定频率的干扰,由于陷波器频率特性的特殊性,它除了可采用双线性变换进行设计外,还可以采用所谓零极点配置的方法进行设计。
一个理想的陷波滤波器的频率特性要在消除的信号频率点处,其值等于零;而在其他频率点处,其值等于1。由于数字滤波器的频率特性就是其单位冲激响应在单位圆上的Z变换,因此只需要在单位圆上相应于所需带阻滤波器阻带位置的频率处设置零点,就可以使滤波器的频率特性在所需阻带频率处为零。但是仅仅进行零点设置只考虑到了滤波器的阻带特性。为了得到非常陡峭的过渡带和常数幅度的通带特性,必须在Z平面上为每一个零点再配置一个相应的极点。Z平面单位圆附近的零点会在滤波器幅频特性的相应频率处产生陷落,零点离单位圆越近,陷落越深;而Z平面单位圆附近的极点会在滤波器幅频特性的相应频率处产生凸峰,极点离单位圆越近,凸峰越高。因此在完成了零点的配置后,为了抵消零点引起的陷落对滤波器通带范围内幅频特性的影响,还需要再配置相应的极点,由于滤波器稳定性的要求,极点必需配置在单位圆内,显然极点离单位圆越近则极点对零点的抵消作用越明显,得到的滤波器的阻带就越窄,过渡带就越陡峭。
二、核心程序
clc;
clear;
close all;
times = 1;
power_line_interference = 1;
order = 1;
%function 1:generator EMG
[EMG_vector60,EMG_vector] = emg_sim(times,power_line_interference);
%function 2:notch_filter
EMG_notch_Filter = emg_notch60(EMG_vector60,order);
%function 3
EMG_notch = emg_freq_null(EMG_vector60);
%function 4
RMS = emg_compare(EMG_vector,EMG_notch);
function EMG_notch_Filter = emg_notch60(EMG_vector60,order);
%EMG_60hz:输入60hz的MEG信号
%order :notch滤波器的阶数
fs = 2048;
N = length(EMG_vector60);
Wp = [1 150]/1000;
Ws = [59 61]/1000;
Rp = 1;
Rs = 15;
[n,Wn] = buttord(Wp,Ws,Rp,Rs);
[b2,a2] = butter(order,Wn,'stop');
figure
freqz(b2,a2,1000,2000)
title('n=2 Butterworth Bandstop Filter')
EMG_notch_Filter=filter(b2,a2,EMG_vector60);
figure
%加入一个60hz的sin
subplot(211);plot(EMG_vector60);title('EMG+sin');grid on;
axis([0,N,1.2*min(EMG_vector60),1.2*max(EMG_vector60)]);
subplot(212);plot(EMG_notch_Filter);title('EMG-sin');grid on;
axis([0,N,1.2*min(EMG_notch_Filter),1.2*max(EMG_notch_Filter)]);
三、测试结果
A25-01
以上是关于EMG信号的低通滤波器的matlab仿真实现的主要内容,如果未能解决你的问题,请参考以下文章
FPGA教程案例53语音案例2——基于FIR低通滤波器的语音信号降噪FPGA实现