低通滤波函数实现

news2024/9/20 22:54:49

在做的项目中需要通过PWM驱动IGBT来控制负载功率,如果PWM频率很高,电流采样基本不受影响。但是IGBT的开关频率高会引起更多的开关损耗,所以降低了PWM频率,但此时电流会是接近于PWM信号的波形,无法准确采集。所以硬件上增加了RC低通滤波,截止频率在5Hz以下,然后软件上通过低通滤波算法进一步将电流拉平。
实测在ADC 1K的采样频率下,电流采样滞后在600ms以内。
下面是C#的实现代码

        // 定义低通滤波器的结构体
        struct LowPassFilter
        {
            public float alpha; // 滤波器系数
            public float previousOutput; // 上一次的输出值
        };


        // 初始化或更新低通滤波器的函数
        void updateLowPassFilter(out LowPassFilter filter, float cutoffFrequency, float sampleRate)
        {
            // 计算时间常数 tau
            float tau = 1.0f / (2.0f * 3.1415926f * cutoffFrequency);
            // 计算采样周期 T
            float T = 1.0f / sampleRate;
            // 计算滤波器系数 alpha
            filter.alpha = T / (T + tau);

            //filter.alpha = 1.0f / (1 + tau * sampleRate);//这一行其实上面两行推导出来的
            filter.previousOutput = 0.0f; // 可以选择重置上一次的输出
        }

        // 处理低通滤波器的函数
        float processLowPassFilter(LowPassFilter filter, float input)
        {
            // 根据IIR低通滤波器的公式计算当前输出
            float output = filter.alpha * input + (1.0f - filter.alpha) * filter.previousOutput;

            // 更新上一次的输出值
            filter.previousOutput = output;
            // 返回当前的输出值
            return output;
        }

函数调用:

        float Value = 0;

        private void button1_Click(object sender, EventArgs e)
        {
            LowPassFilter filter1 = new LowPassFilter();
            LowPassFilter filter2 = new LowPassFilter();
            Random random = new Random();

            int Cnt = 0;
            int Cnt_2 = 0;
            float Cnt_3 = 50;
            float sampleRate = 1000; // 示例采样率

            float outputSignal_1 = 0;
            float outputSignal_2 = 0;
            // 初始化滤波器,设置截止频率
            updateLowPassFilter(out filter1, 1, sampleRate); // 1Hz截止频率                                           // 改变截止频率
            updateLowPassFilter(out filter2, 1, sampleRate * 10); // 改变截止频率为10Hz
            while (Cnt <= 12000)
            {
                Cnt++;
                //delayUs(100);//假装延时100us,模拟单片机的采样间隔
                Cnt_2++;
                if (Cnt_2 >= 100)
                {
                    Cnt_2 = 0;
                    //Cnt_3 = 50 + random.Next(-40,40);
                    Cnt_3 -= 0.5f;

                }

                if (Cnt_2 >= Cnt_3)//模拟不同占空比的PWM
                {
                    Value = 8.5f + (float)random.NextDouble() / 10.0f;
                        
                }
                else
                {
                    Value = 1.5f + (float)random.NextDouble() / 10.0f;
                }

                if (Cnt_2 % 10 == 0)
                {
                    
                    outputSignal_1 = processLowPassFilter(filter1, Value);
                    filter1.previousOutput = outputSignal_1;                  
                }


                    outputSignal_2 = processLowPassFilter(filter2, Value);
                    filter2.previousOutput = outputSignal_2;


                this.chart1.Series[0].Points.AddY(Value);
                this.chart1.Series[1].Points.AddY(outputSignal_1);
                this.chart1.Series[2].Points.AddY(outputSignal_2);

            }
        }

运行效果图:
在这里插入图片描述
可以看到滤波器2的曲线响应速度是快于滤波器1的,也就是采样速度越快,越精确,响应越快

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2107698.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

读取、写入、生成txt文本文档详解——C#学习笔记

一、4中写入文本的方式&#xff1a; //①表示清空 txt StreamWriter mytxt1 new StreamWriter("D:\\1清空.txt"); string t1 ""; mytxt1.Write(t1); mytxt1.Close(); //②表示向txt写入文本 StreamWriter mytxt2 new StreamWriter("D:…

用HTML写一个动态的的电子相册实战详细案例

效果展示&#xff1a;&#x1f447; 详细代码&#xff1a; 1、新建一个.html文件 2、然后将下面的内容复制到 动态相册.html里面 <!DOCTYPE html> <html> <head><title>图片轮播效果</title><style>.container {position: relative;wi…

Pyspark下操作dataframe方法(1)

文章目录 Pyspark dataframe创建DataFrame使用Row对象使用元组与scheam使用字典与scheam注意 agg 聚合操作alias 设置别名字段设置别名设置dataframe别名 cache 缓存checkpoint RDD持久化到外部存储coalesce 设置dataframe分区数量collect 拉去数据columns 获取dataframe列 Pys…

【如何用远程连接到ubuntu服务器上的redis】

文章目录 ubuntu上安装redis常用命令 远程连接测试在另一台PC上进行远程访问 ubuntu上安装redis Redis 5.0 被包含在默认的 Ubuntu 20.04 软件源中。想要安装它&#xff0c;以 root 或者其他 sudo 身份运行下面的命令&#xff1a; sudo apt update //更新apt sudo apt inst…

全视通精彩亮相宁夏养老服务业博览会,助力西北地区养老产业高质量发展

据悉&#xff0c;今年4月&#xff0c;宁夏被列入48个全国基本养老服务综合平台试点地区&#xff0c;是全域申报成功的8个省&#xff08;直辖市&#xff09;之一&#xff0c;也是西北唯一的入选省份。5月&#xff0c;中卫市成功入选2024年居家和社区基本养老服务提升行动项目地区…

多智能体强化学习:citylearn城市建筑能量优化和需求响应

今天分享一个用于能量优化的强化学习框架&#xff0c;citylearn 代码量非常庞大&#xff0c;我都不敢看&#xff0c;看也看不完&#xff0c;不花一定的时间难以搞懂它的原理。 CityLearn&#xff08;CL&#xff09;环境是一个类似 OpenAI Gym 的环境&#xff0c;它通过控制不…

网络安全服务基础Windows--第10节-FTP主动与被动模式

概述 将某台计算机中的⽂件通过⽹络传送到可能相距很远的另⼀台计算机中&#xff0c;是⼀项基本的⽹络应⽤&#xff0c;即⽂件传送。 ⽂件传送协议FTP &#xff08;File Transfer Protocol&#xff09;是因特⽹上使⽤得最⼴泛的⽂件传送协议。 FTP是⼀个⽼早的⽹络协议&…

图形几何-如何将凹多边形分解成若干个凸多边形

凹多边形的概念 凹多边形是指至少有一个内角大于180度的多边形。与之相对&#xff0c;凸多边形的所有内角均小于或等于180度&#xff0c;且任意两点之间的连线都完全位于多边形内部。将凹多边形分解成若干个凸多边形是计算几何中的一个重要问题。 分解原理 将凹多边形分解为凸…

Python【3】乌七八糟

目录 if __name__ "__main__ 模块名————__name__ 装饰器 参数的优化——可以接受任何函数 需要添加自定义参数——再套一层 语法糖——好甜&#xff01; 类init self if __name__ "__main__ 在Python中&#xff0c;if __name__ "__main__"…

再谈全排列

题目链接&#xff1a; . - 力扣&#xff08;LeetCode&#xff09; 每次做全排列的题目&#xff0c;我都要孕育好一阵子&#xff0c;到底怎么去思考这个问题呢&#xff1f; 首先&#xff0c;我觉得最好的方式就是画个树。 画了树之后&#xff0c;你就知道&#xff0c;这个问题&…

鸿蒙轻内核M核源码分析系列五 时间管理

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 持续更新中…… 在鸿蒙轻内核源码分析上一篇文章中&#xff0c;我们剖析了中断的源码&#xff0c;简单提到了Tick中断。本文会继续分析Tick和时间相关的源…

多所高校拟撤销地理、测绘、建筑等相关专业!网友:游了很久,发现没有岸!

近日&#xff0c;各大高校频频传来专业“下线”的消息。多所高校拟撤销地理、测绘等相关专业。对此很多网友破防了&#xff0c;表示&#xff1a;还没毕业&#xff0c;专业没了&#xff1f; 更有城乡规划的网友表示&#xff1a;自己已经成为怨种毕业生&#xff0c;游了很久&…

公司数字化转型的目的是什么?

不同行业公司&#xff0c;其数字化转型的目的也不一样。下面我列举几个行业&#xff0c;给大家讲讲其数字化转型的真正目的。 制造数字化转型 制造业来说&#xff0c;数字化转型的本质是通过新一代信息技术与制造技术的融合&#xff0c;实现以数据为核心的资源要素变革、以网络…

【8.28更新】Win10 22H2 正式版:19045.4842镜像下载!

今日系统之家小编给大家带来2024年最新的Windows10 22H2正式版系统&#xff0c;该版本系统基于微软官方Windows 10 22H2 19045.4842 64位 专业版进行离线制作与优化&#xff0c;系统安全无任何病毒残留&#xff0c;且兼容性出色&#xff0c;能完美兼容新老机型。安装后&#xf…

一大波华为“黑”正在赶来

文&#xff5c;琥珀食酒社 作者 | 积溪 不管你信不信 我都敢肯定的告诉你 又一波黑华为的浪潮 将在下周到来 因为下周二 也就是9月10号 华为将发布一款划时代的产品 华为MateXT非凡大师 三折叠屏手机 就我现在得到的情况 这款手机最大的特点 就是先进 余承东都说…

SRT协议分析以及收拉流测试

文章目录 介绍协议概述协议常用URL格式协议工作流程协议包格式数据包和控制包数据包控制包ACKNACK 开源协议栈libSRTFFmpegVLC Media PlayerSRT AllianceSRS 测试使用ffmpegsrs推流端接收端播放端srs配置 使用 libSRT发送端接收端 介绍 SRT&#xff08;Secure Reliable Transpo…

力扣: 有效的字母异位词

文章目录 需求数组map结尾 需求 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 字母异位词 是通过重新排列不同单词或短语的字母而形成的单词或短语&#xff0c;通常只使用所有原始字母一次。 示例 1: 输入: s “anagram”, t “nagaram…

9、类和对象

9.1 封装 9.1.1 封装的例子 class Student { public:string name;int age; public:void setName(string name_) {name name_;} }; int main() {Student s1;s1.setName("zhangsan");return 0; }类中的行为都叫做成员&#xff0c;例如成员属性&#xff0c;成员变量&…

磁吸轨道灯的优缺点深度解析:为你的家居照明提供新选择

在现代家居装修中&#xff0c;照明设计已成为提升居住品质的重要一环。磁吸轨道灯作为一种新兴的照明解决方案&#xff0c;以其独特的灵活性和美观性逐渐受到市场的青睐。然而&#xff0c;任何产品都有其两面性&#xff0c;磁吸轨道灯也不例外。本文将深入探讨磁吸轨道灯的优缺…

产品起名|给你的产品插上会飞的翅膀

引言&#xff1a;在品牌的世界里&#xff0c;产品的名字不仅仅是一个标签&#xff0c;它是品牌个性、价值和承诺的直接体现。一个好的产品名能够快速传达产品特性&#xff0c;吸引消费者&#xff0c;并在市场中建立独特的品牌形象。 好产品从起名开始 品牌介绍&#xff1a;南京…