滤波算法(一)一阶低通滤波器理论设计&算法实现

模型搭建

物理模型

一阶低通滤波器的物理模型来源于一阶RC滤波器,其输出信号与电容的容抗和电阻的阻抗形成的电路网络有关,此电路网络是由电阻分压网络衍生而来。
在这里插入图片描述

分压电路输出信号如下:

V o u t = V i n R 2 R 1 + R 2 Vout=Vin\frac{R2}{R1+R2} Vout=VinR1+R2R2

RC滤波电路输出信号如下:

V o u t = V i n X c R 2 + X c 2 = 1 ω C ( 1 ω C ) 2 + R 2 \begin{align*} Vout&=Vin\frac{Xc}{\sqrt{R^2+Xc^2}}\\ &=\frac{\frac{1}{\omega C}}{\sqrt{(\frac{1}{\omega C})^2+R^2}}\\ \end{align*} Vout=VinR2+Xc2 Xc=(ωC1)2+R2 ωC1

传递函数

一阶低通滤波器传递函数即(这里的 j ω j\omega 不同于之上的 ω \omega ω, j ω j\omega 是虚数):

F ( j w ) = V o u t ( j w ) V i n ( j w ) = X c R + X c = 1 j ω C 1 j ω C + R = 1 1 + s R C \begin{align*} F(jw)&=\frac{Vout(jw)}{Vin(jw)}\\ &=\frac{Xc}{R+Xc}\\ &=\frac{\frac{1}{j\omega C}}{\frac{1}{j\omega C}+R}\\ &=\frac{1}{1+sRC}\\ \end{align*} F(jw)=Vin(jw)Vout(jw)=R+XcXc=C1+RC1=1+sRC1

实际结果就是一阶低通滤波器在系统分析上为一个典型的惯性环节即:

G ( s ) = 1 1 + T s G(s)=\frac{1}{1+Ts} G(s)=1+Ts1

其幅频和相频特性为:

{ A ( ω ) = 1 ( 1 + T 2 ω 2 ) 1 2 φ ( ω ) = − a r c t a n T ω \left\{ \begin{aligned} &A(\omega)=\frac{1}{(1+T^2\omega^2)^\frac{1}{2}}\\ &\varphi(\omega)=-arctanT\omega\\ \end{aligned} \right. A(ω)=(1+T2ω2)211φ(ω)=arctanTω

Simulink波形仿真

在这里插入图片描述

参数原理

截止频率

在3dB带宽系统中(即半功率系统),信号幅值增益为-3dB( 20 log ⁡ ( 0.7079 ) ≈ − 3 d B 20\log(0.7079)\approx-3dB 20log(0.7079)3dB)时的频率为滤波器的截止频率。那么此时输出信号 V o u t ≈ 0.7079 V i n Vout\approx0.7079Vin Vout0.7079Vin
在这里插入图片描述

那么根据RC滤波器输出信号公式且 ω = 2 π f \omega=2\pi f ω=2πf可得截止频率

0.7079 V i n ≈ V i n X c R 2 + X c 2 0.7079 ≈ 1 ω C ( 1 ω C ) 2 + R 2 0.707 9 2 ≈ ( 1 ω C ) 2 ( 1 ω C ) 2 + R 2 ( 1 ω C ) 2 ≈ 0.707 9 2 1 − 0.707 9 2 R 2 ω ≈ 1 0.707 9 2 1 − 0.707 9 2 R C f c ≈ 1 2 π R C \begin{align*} 0.7079Vin&\approx Vin\frac{Xc}{\sqrt{R^2+Xc^2}}\\ 0.7079&\approx\frac{\frac{1}{\omega C}}{\sqrt{(\frac{1}{\omega C})^2+R^2}}\\ 0.7079^2&\approx\frac{(\frac{1}{\omega C})^2}{(\frac{1}{\omega C})^2+R^2}\\ (\frac{1}{\omega C})^2&\approx\frac{0.7079^2}{1-0.7079^2}R^2\\ {\omega}&\approx\frac{1}{\sqrt{\frac{0.7079^2}{1-0.7079^2}}RC}\\ f_c&\approx\frac{1}{2\pi RC}\\ \end{align*} 0.7079Vin0.70790.70792(ωC1)2ωfcVinR2+Xc2 Xc(ωC1)2+R2 ωC1(ωC1)2+R2(ωC1)210.707920.70792R210.707920.70792 RC12πRC1

相位延迟

相位延迟在上一节传递函数时其实已经提到,即该模型的相频特性:

φ ( ω ) = − a r c t a n ( ω R C ) = − a r c t a n ( 2 π f R C ) \begin{align*} \varphi(\omega)&=-arctan(\omega RC)\\ &=-arctan(2\pi f RC) \end{align*} φ(ω)=arctan(ωRC)=arctan(2πfRC)

算法实现

滤波器离散化

那么实际上一阶低通滤波器就已经可以看作是一阶惯性环节,在数字信号中对一阶惯性环节进行离散化,在向后差分法 Z \mathcal{Z} Z变换中:

s = 1 − z − 1 T s=\frac{1-z^{-1}}{T} s=T1z1

则代入传函中可得:

G ( z ) = 1 1 + 1 − z − 1 T R C C ( z ) R ( z ) = 1 1 + 1 − z − 1 T R C R ( z ) = ( C ( z ) + C ( z ) 1 − z − 1 T R C ) R ( z ) = ( 1 + R C T ) − C ( z ) z − 1 R C T C ( z ) = R ( z ) 1 1 + R C T + C ( z ) z − 1 R C T 1 + R C T \begin{align*} G(z)&=\frac{1}{1+\frac{1-z^{-1}}{T}RC}\\ \frac{C(z)}{R(z)}&=\frac{1}{1+\frac{1-z^{-1}}{T}RC}\\ R(z)&=(C(z)+C(z)\frac{1-z^{-1}}{T}RC)\\ R(z)&=(1+\frac{RC}{T})-C(z)z^{-1}\frac{RC}{T}\\ C(z)&=R(z)\frac{1}{1+\frac{RC}{T}}+C(z)z^{-1}\frac{\frac{RC}{T}}{1+\frac{RC}{T}}\\ \end{align*} G(z)R(z)C(z)R(z)R(z)C(z)=1+T1z1RC1=1+T1z1RC1=(C(z)+C(z)T1z1RC)=(1+TRC)C(z)z1TRC=R(z)1+TRC1+C(z)z11+TRCTRC

差分化后:

C ( n ) = R ( n ) 1 1 + R C T + C ( n − 1 ) R C T 1 + R C T = R ( n ) T T + R C + C ( n − 1 ) R C T + R C = R ( n ) T T + R C + C ( n − 1 ) ( T + R C ) − T T + R C = C ( n − 1 ) + ( R ( n ) − C ( n + 1 ) ) T T + R C \begin{align*} C(n)&=R(n)\frac{1}{1+\frac{RC}{T}}+C(n-1)\frac{\frac{RC}{T}}{1+\frac{RC}{T}}\\ &=R(n)\frac{T}{T+RC}+C(n-1)\frac{RC}{T+RC}\\ &=R(n)\frac{T}{T+RC}+C(n-1)\frac{(T+RC)-T}{T+RC}\\ &=C(n-1)+(R(n)-C(n+1))\frac{T}{T+RC}\\ \end{align*} C(n)=R(n)1+TRC1+C(n1)1+TRCTRC=R(n)T+RCT+C(n1)T+RCRC=R(n)T+RCT+C(n1)T+RC(T+RC)T=C(n1)+(R(n)C(n+1))T+RCT

lim ⁡ T → 0 \lim\limits_{T\to 0} T0lim时, T + R C ≈ R C T+RC\approx RC T+RCRC那么上式:

C ( n ) = C ( n − 1 ) + ( R ( n ) − C ( n − 1 ) ) T R C = C ( n − 1 ) + 2 π f T ( R ( n ) − C ( n − 1 ) ) = ( 1 − 2 π f T ) C ( n − 1 ) + ( 2 π f T ) R ( n ) \begin{align*} C(n)&=C(n-1)+(R(n)-C(n-1))\frac{T}{RC}\\ &=C(n-1)+2\pi fT(R(n)-C(n-1))\\ &=(1-2\pi fT)C(n-1)+(2\pi fT)R(n) \end{align*} C(n)=C(n1)+(R(n)C(n1))RCT=C(n1)+2πfT(R(n)C(n1))=(12πfT)C(n1)+(2πfT)R(n)

2 π f T 2\pi fT 2πfT转换为系数 α \alpha α

C语言实现

#define LOW_PASS_FILTERING_ALPHA 0.4f //1~0

typedef struct {
    float value_current;
    float value_last;
} FOLPF_DATATypeDef;

void FLOAT_FirstOrderLowPassFiltering_Process(FOLPF_DATATypeDef *data_pointer){

    data_pointer->value_current=((1-LOW_PASS_FILTERING_ALPHA)*data_pointer->value_last)
                                +(LOW_PASS_FILTERING_ALPHA *data_pointer->value_current);

    data_pointer->value_last=data_pointer->value_current;
}

### 回答1: 低通滤波是一种数字信号处理算法,常用于去除高频成分,保留低频成分的信号处理过程。C语言是一种流行的编程语言,以下是用C语言实现低通滤波算法的基本步骤。 首先,需要定义信号数据的结构,包括信号的采样率、采样点数和信号数组等。 ```c #define SAMPLE_RATE 1000 // 采样率为1000Hz #define NUM_SAMPLES 1000 // 采样点数为1000个 typedef struct { float samples[NUM_SAMPLES]; } Signal; ``` 接下来,可以实现低通滤波函数,该函数的输入为原始信号和截止频率,输出为滤波后的信号。 ```c void lowPassFilter(Signal *input, Signal *output, float cutoffFrequency) { float RC = 1.0 / (2 * M_PI * cutoffFrequency); // RC常数 float alpha = SAMPLE_RATE / (SAMPLE_RATE + RC); // alpha系数 // 使用一阶低通滤波器进行滤波 output->samples[0] = input->samples[0]; for (int i = 1; i < NUM_SAMPLES; i++) { output->samples[i] = alpha * input->samples[i] + (1 - alpha) * output->samples[i - 1]; } } ``` 最后,可以在主函数中调用低通滤波函数并输出结果。 ```c int main() { Signal inputSignal; Signal outputSignal; // 假设已有原始信号数据,存放在inputSignal中 // ... float cutoffFrequency = 50.0; // 截止频率为50Hz lowPassFilter(&inputSignal, &outputSignal, cutoffFrequency); // 输出滤波后的信号数据 for (int i = 0; i < NUM_SAMPLES; i++) { printf("%f ", outputSignal.samples[i]); } printf("\n"); return 0; } ``` 以上就是用C语言实现低通滤波算法的基本步骤。通过定义信号结构和实现低通滤波函数,可以对原始信号进行滤波处理,得到保留低频成分的滤波后信号。 ### 回答2: 低通滤波算法是一种用于信号处理的常用算法,它通过去除信号中高频部分从而实现平滑信号的目的。在C语言中,我们可以使用数字滤波器来实现低通滤波。 首先,我们需要定义一个滤波器的阶数和截止频率。阶数决定了滤波器的复杂度,通常选择低阶滤波器可以平滑信号并避免过度衰减。截止频率决定了滤波器开始衰减的频率。 接下来,我们可以使用差分方程的方法来实现低通滤波器。差分方程描述了滤波器的输入和输出之间的关系。常见的差分方程形式是一阶和二阶差分方程。 在C语言中,我们可以使用循环语句和数组来实现低通滤波器的算法。我们首先读取输入信号的样本值,并将其存储在一个数组中。然后,我们根据定义的差分方程,使用循环语句计算滤波器的输出值,并将其存储在另一个数组中。 最后,我们可以使用输出数组的值来绘制滤波后的信号波形图。这将帮助我们更好地理解滤波算法的效果。 总结来说,低通滤波是一种常用的信号处理算法,在C语言中可以通过定义滤波器的阶数和截止频率,并使用差分方程的方法来实现。通过循环和数组来计算滤波器的输出值,并绘制滤波后的信号波形图,我们可以获得平滑的信号。 ### 回答3: 低通滤波算法是一种用于信号处理的算法,它能够去除信号中的高频成分,从而保留信号中的低频成分。低通滤波在很多领域都有广泛的应用,例如音频处理、图像处理等。 在C语言中,可以使用数字滤波器来实现低通滤波算法。常见的低通滤波器包括FIR滤波器和IIR滤波器。 FIR滤波器是一种有限脉冲响应滤波器,通过将输入信号与滤波器的冲激响应序列进行卷积运算来实现滤波。FIR滤波器的特点是稳定性好,易于设计,但计算复杂度较高。在C语言中,可以通过定义滤波器的冲激响应序列以及输入信号,使用循环等算法实现FIR滤波器。 IIR滤波器是一种无限脉冲响应滤波器,通过将输出信号与滤波器的差分方程进行递归运算来实现滤波。IIR滤波器的特点是计算复杂度低,但易于出现不稳定性。在C语言中,可以通过定义滤波器的差分方程以及输入信号,使用循环等算法实现IIR滤波器。 以上是关于低通滤波算法在C语言中的实现方法的简单介绍。实际的滤波算法实现还需要考虑信号的采样率、滤波器的截止频率以及过渡带宽等参数,以及相关的数值计算和处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值