单相SOGI离散化方法选择以及实现过程

本文介绍了在SOGI中使用频率自适应方法时,后向差分导致幅值振荡的问题,通过对比,提出采用双线性变换离散化方法,提供了一种改进的SOGI实现过程,包括系数计算和MATLAB仿真实验,结果显示双线性变换能有效减少幅值抖动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在上一篇文章中,我使用的是频率自适应的SOGI,并且最后采用了后向差分的方式实现SOGI,这样实现确实可以准确锁出频率和相角,
但除了频率和相角,通常我们还需要知道对象的幅值,***然而采用后向差分可能会导致计算出来的幅值出现小幅度的振荡***。
而采用双线性变换的离散化方式则没有这个问题,因此给出**双线性变换的实现过程**。

在上一篇文章中给出了SOGI连续域alpha和beta的输出表达式,这里将其分别进行后相差分和双线性变换离散,得到的表达式如下:
离散化表达式

用MATLAB搭建仿真观察三个表达式的效果:
纯数学模型
alpha输出
幅值还原

图一为传递函数的仿真模型,输入信号为频率50Hz幅值311的正弦信号。
图二展示了输入信号(红色)和三种形式传递函数的alpha输出,三种形式都能迅速跟上输入信号,只有很小的差别。
图三是根据三种形式传递函数的输出计算的幅值结果,即根号(alpha²+beta²),可以看到后向差分离散的结果(浅蓝色)存在抖动现象,因此在离散的时候可以选择双线性变换的方式。

双线性SOGI实现过程

/*首先定义一个结构体存放一些计算过程中用到的变量*/
struct SOGI
{
	float  w_p;			//输出角频率
	float  v_p;          //alpha输出(v')
	float  qv_p;         //beta输出(qv')
	float  phase;        //相角
	float   mag;         //幅值
	///    改进直接程序法用到的中间变量
	float   qk0;  //当前拍
	float   qk1;  //上一拍
	float   qk2;   //上上拍
	///
	float Ts;        //采样周期
	float err_v;     //alpha误差
	float *input;      //输入信号
	float sin;
}
struct SOGI FLL;
#deine FLL_QSGgain  1.414     //上一篇提到的参数k
#define FLL_NormalGgain  -47  //上一篇提到的另一个叫不上名字的参数
#define PI  3.1415926535
void SOGI_clc()               //计算函数
{
/// 根据上述双线性离散后的表达式得到的各项系数
	den1 = 4 + FLL.w_p*FLL.w_p*FLL.Ts*FLL.Ts - 2*FLL_QSGgain*FLL.w_p*FLL.Ts;
    den2 = 2*FLL.w_p*FLL.w_p*FLL.Ts*FLL.Ts - 8;
    den3 = 4 + FLL.w_p*FLL.w_p*FLL.Ts*FLL.Ts + 2*FLL_QSGgain*FLL.w_p*FLL.Ts;
    num1 = 2*FLL_QSGgain*FLL.w_p*FLL.Ts;
    num2 = FLL_QSGgain*FLL.w_p*FLL.w_p*FLL.Ts*FLL.Ts;
///
    FLL.qk0 = (*(FLL.input) - den2*FLL.qk1 - den1*FLL.qk2)/den3;
    FLL.v_p = num1*(FLL.qk0 - FLL.qk2);   //alpha
    FLL.qv_p = num2*(FLL.qk0 + 2*FLL.qk1 + FLL.qk2);  //beta
    FLL.qk2 = FLL.qk1;
    FLL.qk1 = FLL.qk0;
    
    FLL.mag = sqrt(FLL.v_p*FLL.v_p + FLL.qv_p*FLL.qv_p);
    FLL.phase = atan2(FLL.v_p,FLL.qv_p);
    if(FLL.phase < 0)FLL.phase += 2*PI;
    FLL.sin = sinf(FLL.phase);
    //频率自适应
    FLL.err_v = *(FLL.input) - FLL.v_p;
    FLL.w_p += FLL.w_p*FLL.err_v*FLL.qv_p*FLL_QSGgain*FLL_NormalGgain / (FLL.v_p*FLL.v_p + FLL.qv_p*FLL.qv_p+0.1);
}
### SOGI锁相环离散化实现方法 #### 数字离散化方法概述 SOGI(Second Order Generalized Integrator)是一种用于电力电子系统的信号处理工具,能够有效提取交流信号中的基波分量并生成与其正交的信号。对于SOIG的应用,在实际工程中通常需要将其转换为数字形式以便于嵌入式系统实现。 为了完成这一过程,常用的方法是对连续时间域下的传递函数进行Z变换得到对应的差分方程[^1]。具体来说,就是利用双线性变换法或其他合适的映射策略来近似模拟原系统的动态特性。这种方法不仅保持了原有系统的稳定性特征,而且易于编程实现。 #### 理论基础 考虑到SOGI本质上是一个二阶带通滤波器(BPF),其频率响应具有特定的选择性和阻尼系数ω_n和ζ。当应用于PLL (Phase-Locked Loop) 中时,可以通过调整这些参数使得输出跟踪输入信号的变化趋势。在理想情况下,即使存在噪声干扰或者其他非理想因素影响,经过适当配置后的SOGI仍然能稳定工作,并且具备良好的抗扰动能力[^2]。 #### 实现细节 针对上述提到的设计思路,下面给出了一段简单的C语言代码片段作为实例说明如何构建一个基本版本的数字化SOGI模块: ```c #include <stdio.h> #define PI 3.14159265358979323846f // 定义SOGI结构体 typedef struct { float w; // 自然角频率 ωn float zeta; // 阻尼比 ζ float x1, y1; } SOGIFilter; void init_sogi(SOGIFilter *filter, float wn, float damping_ratio){ filter->w = wn; filter->zeta = damping_ratio; } float process_sample(SOGIFilter* filter,float input){ static float prev_input=0,prev_output=0,x2,y2; // 计算当前时刻的状态变量更新值 x2 = (-input + 2*filter->zeta*PI*filter->w*prev_input+(pow(filter->w,2)*prev_output))/(1+2*filter->zeta*PI*filter->w+pow(PI*filter->w,2)); y2 = ((-2*x2)+(-2*y2)+(2*(prev_input-prev_output)))/(1-(2*pow(x2,2))); // 更新历史数据 prev_input=input; prev_output=y2; return y2; } ``` 这段程序定义了一个名为`process_sample()`的功能函数用来接收新的采样点并通过内部状态机计算出相应的输出结果。这里采用的是较为通用的一组递推关系式来进行数值求解[^3]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值