一阶RC滤波器的算法实现(低通和高通)

目前,项目需要处理信号。目标信号是特定频率范围内的信号。高频视为干扰。而一阶RC滤波器容易实现。但是网上资料往往没有详细的推导。因此在这里把笔记记下。本文的优势是比较详细,参数配置都有公式依据。

目录

1、一阶RC低通滤波器的算法实现

1.1 算法推导

1.2 波特图

1.3 用C语言实现

 2、一阶RC高通滤波器的原理以及实现

2.1 原理推导

2.2 波特图

2.3 用C语言实现

3 上机测试


1、一阶RC低通滤波器的算法实现

1.1 算法推导

一阶RC滤波器的硬件电路如图:

图中输入电压是Vi,电阻R,电容C,输出电压为Vo。

假设电路的输出阻抗很大(即不带任何负载),输入阻抗很小(理想情况)。可以得到以下公式:

V_o = \frac{1}{1+j\omega RC}V_i

电容的阻抗是Z_C = \frac{1}{j\omega C}

\omega = 2\pi f

截止频率f_{cut} = \frac{1}{2\pi RC},此频率下的信号,通过这个电路,输出电压和输入电压的关系式是V_o = \frac{1}{1+j}V_i

或者时域上的表达式:

V_o = V_i - RC\frac{dV_o}{dt}

上式离散后,可以得到:

V_o\left ( k \right )=\frac{V_i\left ( k \right )+\frac{RC}{T_s}V_o\left ( k-1 \right )}{1+\frac{RC}{T_s}}

假如要过滤掉10KHz以上的频率,可以选择fcut = 1K,并计算RC的值,代入上式。

1.2 波特图

用Octave或者Matlab可以得到传递函数的波特图:

fcut =1000;
RC=1/2/pi/fcut;
%pkg load control   %Octave用的读取control包
y1 = tf(1,[RC,1])
bode(y1)

以上波特图可见,在截止频率处(\omega =2\pi f,代入f=1k,可得截至角频率是6283 rad/s),信号会衰减到原来的0.707。这电路对频率大于截止频率的高频信号,具有比较强的衰减作用,同时对该信号有比较大的相位移动。

 

1.3 用C语言实现

C语言的实现1

/**
  * @brief  implement 1 order RC low pass filter
  *         raw data filtered by a simple RC low pass filter@cufoff=5Hz
  * @param  Vi 		: 	Vi(k)
  * @param  Vi_p 	: 	Vi(k-1)
  * @param  Vo 		: 	Vo(k)
  * @param  Vo_p 	: 	Vo(k-1)
  * @note   This example shows a simple way to report end of conversion
  *         and get conversion result. You can add your own implementation.
  * @retval None
  */
void LowPassFilter_RC_1order(float *Vi, float *Vo, float *Vo_p, float sampleFrq )
{
	float CutFrq, RC, Cof1, Cof2;
		
	//low pass filter @cutoff frequency = 5 Hz		
	CutFrq = 5;
	RC = (float)1.0/2.0/PI/CutFrq;
	Cof1 = 1/(1+RC*sampleFrq);
	Cof2 = RC*sampleFrq/(1+RC*sampleFrq);
	*Vo = Cof1 * (*Vi) + Cof2 * (*Vo_p);		
	
	//update 	
	*Vo_p = *Vo;		
}

调用例子:


float b_ADCLoad1Volt, b_ADCLoad1VoltFltr, b_ADCLoad1VoltFltrPrv;


LowPassFilter_RC_1order(&b_ADCLoad1Volt, &b_ADCLoad1VoltFltr, &b_ADCLoad1VoltFltrPrv, 1000.0);

C语言实现2:


//*********** Structure Definition ********//
typedef struct {
	float  Vi;
	float  Vo_prev;
	float  Vo;
	float  Fcutoff;
	float  Fs;
} LPF_1orderRC_F;
//*********** Structure Init Function ****//
void LPF_1orderRC_F_init(LPF_1orderRC_F *v)
{
	v->Vi=0;
	v->Vo_prev=0;
	v->Vo=0;

	//low pass filter @cutoff frequency = 5 Hz		
	v->Fcutoff=5;

	// execute 1000 every second
	v->Fs=1000;
}

//*********** Function Definition ********//
float LPF_1orderRC_F_FUNC(LPF_1orderRC_F *v)
{
	float RC, Cof1, Cof2;
		
	RC = (float)1.0/2.0/PI/v->Fcutoff;
	Cof1 = 1/(1+RC*v->Fs);
	Cof2 = RC*v->Fs/(1+RC*v->Fs);
 
	v->Vo = Cof1 * v->Vi + Cof2 * v->Vo_prev;
 
	v->Vo_prev = v->Vo;
	
	return v->Vo;
}

LPF_1orderRC_F lpf_1orderrc_handle;

调用方式:

...
int main(void)
{
    ...
    LPF_1orderRC_F_init(&lpf_1orderrc_handle);    //初始化
    while(1)
    {
        ...
        if(flag_1ms==1)
        {
            lpf_1orderrc_handle.Vi = ADCresult;        //假设ADCresult是ADC采样结果
            LPF_1orderRC_F_FUNC(&lpf_1orderrc_handle);    //usage
	    FilteredResult = lpf_1orderrc_handle.Vo;    //FilteredResult存放滤波结果
        }
    }
}

 

 

 

 2、一阶RC高通滤波器的原理以及实现

2.1 原理推导

这是一节RC高通滤波器的原理图:

V_o = \frac{1}{1+\frac{1}{j\omega RC}}V_i

截止频率f_{cut} = \frac{1}{2\pi RC}

写成时域上的表达式:

V_o = C\frac{d\left ( V_i - V_o \right )}{dt}R

离散化后得到:

V_o\left ( k \right )=\left ( V_i\left ( k \right )-V_i\left ( k-1 \right )+V_o\left ( k-1 \right ) \right )\frac{RC}{RC+T_s}

根据设定的截止频率,假如目标频率是50Hz,截止频率可以整定为0.5Hz,过滤低频分量,而不影响目标信号的采集。

RC = \frac{1}{2\pi f_{cut}}

2.2 波特图

传递函数可又频域函数转换得到,将s=j\omega带入频域公式。得到:

V_o = \frac{RCs}{RCs+1}V_i

Octave绘制波特图:

fcut =0.5;
RC=1/2/pi/fcut;
pkg load control
y1 = tf([RC,0],[RC,1])
bode(y1)

 

 

高通滤波器对截至频率以上的信号无大影响,信号能正常经过滤波器。但是该滤波器对截至频率以下的信号,具有较大的影响。和截至频率相比,频率越小,衰减作用越明显。同时在相位图中可见,对频率越低的信号,相位移动也越大。

 

2.3 用C语言实现

C语言的实现1:

void HighPassFilter_RC_1order(float *Vi, float *Vi_p, float *Vo, float *Vo_p, float sampleFrq )
{
	float CutFrq, RC, Coff;
		
	//high pass filter @cutoff frequency = 0.5 Hz		
	CutFrq = 0.5;
	RC = (float)1.0/2.0/PI/CutFrq;
	Coff = RC/(RC + 1/sampleFrq);
	*Vo = ((*Vi) - (*Vi_p) +(*Vo_p) )*Coff ;		
	
	//update 	
	*Vo_p = *Vo;	
	*Vi_p = *Vi;		
}

调用例子:


float b_ADCLoad1Volt, b_ADCLoad1VoltPrv, b_ADCLoad1VoltFltr, b_ADCLoad1VoltFltrPrv;


HighPassFilter_RC_1order(&b_ADCLoad1Volt, &b_ADCLoad1VoltPrv, &b_ADCLoad1VoltFltr, &b_ADCLoad1VoltFltrPrv, 1000.0);

调用时,1000是指每秒需要执行这个函数1000次。

C语言实现2:


#define PI 3.1415


//*********** Structure Definition ********//
typedef struct {
	float  Vi;
	float  Vi_prev;
	float  Vo_prev;
	float  Vo;
	float  Fcutoff;
	float  Fs;
} HPF_1orderRC_F;
//*********** Structure Init Function ****//
void HPF_1orderRC_F_init(HPF_1orderRC_F *v)
{
	v->Vi=0;
	v->Vi_prev=0;
	v->Vo_prev=0;
	v->Vo=0;

	//high pass filter @cutoff frequency = 0.05 Hz		
	v->Fcutoff=0.05;

	// execute 1000 every second
	v->Fs=1000;
}

//*********** Function Definition ********//
float HPF_1orderRC_F_FUNC(HPF_1orderRC_F *v)
{
	float RC, Coff;
 
	RC = (float)1.0/2.0/PI/v->Fcutoff;
	Coff = RC/(RC + 1/v->Fs);
	v->Vo = (v->Vi - v->Vi_prev + v->Vo_prev ) * Coff;
 
	//update 	
	v->Vo_prev = v->Vo;
	v->Vi_prev = v->Vi;	
	
	return v->Vo;
}

HPF_1orderRC_F hpf_1orderrc_handle;

调用例子:

...
int main(void)
{
    ...
    HPF_1orderRC_F_init(&hpf_1orderrc_handle);    //初始化
    while(1)
    {
        ...
        if(flag_1ms==1)
        {
            hpf_1orderrc_handle.Vi = ADCresult;        //假设ADCresult是ADC采样结果
            
            FilteredResult = HPF_1orderRC_F_FUNC(&hpf_1orderrc_handle);//FilteredResult存放滤波结果  
        }
    }
}

 

3 上机测试

板子上面MCU采用STM32F103C8,外扩了USB转UART模块,外扩了PIR+运放模块。

在STM32F103C8上面,PA7连接了某信号源。USART1和FT232模块连接,与电脑通信。

单片机对PA7的采样信号进行滤波处理,目的是把目标信号的直流部分和高频部分滤除,得到0.05Hz-5Hz以内的分量。

上位机使用了SerialChart-0.3.4,把信号波形显示。效果如下图。数据第一列是时间戳,第二列是原始数据,第三列是滤波后的数据。Chart中,蓝色是第二列原始数据,红色是第三列滤波后的数据。

可以看到,滤波器对直流信号有衰减作用。

<think>好的,我现在需要帮助用户了解如何在SVPWM中实现滤波算法。首先,我需要先理解用户的问题。用户提到了SVPWM滤波,结合他们提供的参考引用,特别是引用[1]引用[2],看来用户可能在电机控制或逆变器应用中使用SVPWM,并且需要在其中加入滤波处理。 首先,我应该回顾下SVPWM的基本原理。SVPWM(空间矢量脉宽调制)是用于三相逆变器控制的种调制技术,常用于电机驱动,如FOC(矢量控制)中。它的主要作用是过生成适当的PWM波形来控制电机的电压频率,从而实现高效的能量转换精确的电机控制。 接下来,用户想了解在SVPWM中如何实现滤波算法。根据引用[1],滤波器用于衰减高频信号,保留频成分。滤波器常用于平滑信号或消除高频噪声,而二滤波器可能用于需要更高衰减的情况。但这里用户明确提到滤波,所以需要关注实现方法。 接下来,我需要确定SVPWM中哪些部分可能需要滤波。在FOC控制中,常会采集电流或电压信号,这些信号可能含有高频噪声,例如来自PWM开关的噪声。因此,在电流采样或反馈回路中,可能需要使用滤波器来滤除高频噪声,确保控制系统的稳定性准确性。 现在,问题是如何在SVPWM的实现中加入滤波。首先,滤波器的数学模型是个差分方程,可以用软件实现。在数字信号处理中,滤波器可以过以下公式表示: $$ y[n] = \alpha x[n] + (1 - \alpha) y[n-1] $$ 其中,$\alpha$是滤波系数,与截止频率相关,$x[n]$是当前输入,$y[n]$是当前输出,$y[n-1]$是前次的输出。 接下来,我需要考虑这个滤波器应该应用在SVPWM的哪个环节。例如,在电流采样后,可能需要对采样信号进行滤波,或者在生成SVPWM波形前的某些计算步骤中需要平滑处理。例如,在FOC控制中,ClarkePark变换后得到的电流信号可能需要滤波以去除噪声,特别是在测量相电流时,可能会引入开关噪声。 然后,我需要解释如何将滤波器的差分方程转换为具体的代码实现,这可能涉及到在嵌入式系统中实时处理采样数据。例如,在每次ADC采样后,应用滤波算法,更新滤波后的值,并将其用于后续的SVPWM计算或控制逻辑中。 此外,需要确定截止频率的选择。根据引用[1],截止频率的选择需要根据有用信号干扰信号的频率特性来决定。例如,在电机控制中,如果电机的基波频率较,而开关频率较高(如10kHz),则截止频率可以设置为高于基波频率但远于开关频率,以有效滤除开关噪声而不影响控制信号。 另外,用户可能关心滤波器实现是否会影响系统的动态响应。因为滤波器会引入相位延迟,这在实时控制系统中可能会影响稳定性。因此,需要权衡截止频率的选择,确保滤波效果的同时不影响系统的响应速度。 最后,可能需要结合具体的代码示例,如使用C语言在嵌入式系统中实现滤波器,并集成到SVPWM的生成流程中。例如,在每次电流采样中断服务例程中调用滤波函数,更新滤波后的电流值,再用于坐标变换SVPWM的计算。 总结起来,回答的结构应该包括: 1. 滤波器的原理,包括传递函数差分方程。 2. 在SVPWM中的具体应用场景,如电流采样滤波。 3. 实现步骤,包括参数计算(如alpha的计算)、代码示例。 4. 注意事项,如截止频率的选择相位延迟的影响。 5. 可能的相关问题,引导用户进步学习。 需要确保使用正确的LaTeX格式,如行内公式用$...$,独立公式用$$...$$,并引用提供的参考文献中的相关内容。同时,生成的相关问题应围绕SVPWM滤波的应用、参数调整、优化方法等展开。</think>在SVPWM中实现滤波算法,主要用于滤除高频噪声(如开关噪声)并保留有用信号。以下是具体实现方法及原理分析: --- ### **滤波算法原理** 滤波器的传递函数在连续域中为: $$ H(s) = \frac{1}{1 + \tau s} $$ 其中$\tau = RC$为时间常数,与截止频率$f_c$的关系为: $$ f_c = \frac{1}{2\pi\tau} $$ 在数字域中,过双线性变换或前向差分法可离散化为差分方程: $$ y[n] = \alpha x[n] + (1 - \alpha) y[n-1] $$ 其中$\alpha = \frac{T_s}{T_s + \tau}$,$T_s$为采样周期。此公式直接对应代码实现[^1]。 --- ### **SVPWM中滤波器的应用场景** 在FOC控制中,滤波常用于以下场景: 1. **电流采样滤波**:ADC采集的相电流可能含开关噪声(如PWM频率附近的干扰),需滤波后用于Clarke/Park变换[^2]。 2. **速度/位置反馈滤波**:编码器信号中的高频抖动需滤除以提高控制稳定性。 --- ### **实现步骤** 1. **参数设计**: - 确定截止频率$f_c$(常为基波频率的$5$-$10$倍)。 - 根据采样频率$f_s$计算$\alpha$: $$ \alpha = \frac{2\pi f_c T_s}{1 + 2\pi f_c T_s} $$ 2. **代码实现**(以C语言为例): ```c float LPF(float input, float alpha, float *prev_output) { float output = alpha * input + (1 - alpha) * (*prev_output); *prev_output = output; return output; } ``` 3. **集成到SVPWM流程**: - 在ADC中断中调用滤波函数处理电流采样值。 - 将滤波后的电流用于坐标变换SVPWM计算。 --- ### **注意事项** - **相位延迟**:滤波器会引入滞后,可能影响动态响应,需过调整$f_c$平衡滤波效果与延迟。 - **数值稳定性**:避免$\alpha$过小导致输出“僵滞”,常取$0.01 < \alpha < 0.3$。 ---
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值