Python代码如下

  1. import pandas as pd
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. from scipy import signal
  5.  
  6. def lowpass_Butterworth(sig,fs,filter_cutoff=None,order=8,axis=0):
  7.  
  8. '''
  9. Butter-worth低通滤波
  10. Inputs:
  11. sig --- numpy array, 输入时间序列数据
  12. fs --- int, 采样率
  13. filter_cutoff --- float, 截断频率,滤掉高于此频率的成分
  14. order --- int, 滤波器阶次
  15. axis --- int, 在sig的哪个轴上施加滤波
  16. '''
  17. if not filter_cutoff:
  18. filter_cutoff=fs/4
  19. b,a = signal.butter(order,filter_cutoff / (fs/2),'low')
  20. sig = signal.filtfilt(b,a,sig,axis=axis)
  21. return sig
  22.  
  23. # 读取数据
  24. data = pd.read_csv('clean_data_row6.csv')
  25. data = np.array(data)
  26. dataLen = len(data)
  27. # Butter-worth低通滤波
  28. fs=50 #采样频率
  29. filter_cutoff=10 #截断频率
  30. axis=0 #时间轴所在维度
  31. # use_downsamping=True #是否降采样
  32. calcData = lowpass_Butterworth(data, fs, filter_cutoff)
  33. calcData = np.array(calcData)
  34. calcDataLen = len(calcData)
  35.  
  36. # 绘制原始数据图和Butter-worth低通滤波图
  37. # 原始数据图
  38. plt.figure(figsize=(12, 6))
  39. plt.subplot(1, 2, 1)
  40. plt.plot(np.arange(dataLen), np.abs(data))
  41. plt.title('Original Datas')
  42.  
  43. # Butter-worth低通滤波图
  44. plt.subplot(1, 2, 2)
  45. plt.plot(np.arange(calcDataLen), np.abs(calcData))
  46. plt.title('Lowpass Butterworth Datas')
  47.  
  48. plt.tight_layout()
  49. plt.show()

下面我们修改成C#代码

创建控制台程序,Nuget安装 CsvHelper 和 pythonnet

  1. public class Program
  2. {
  3. const string PathToPythonDir = "D:\\Python311";
  4. const string DllOfPython = "python311.dll";
  5.  
  6. static void Main(string[] args)
  7. {
  8. // Butter-worth低通滤波
  9. ButterworthLowpass();
  10. }
  11. /// <summary>
  12. /// Butter-worth低通滤波
  13. /// </summary>
  14. static void ButterworthLowpass(int fs = 250, double filterCutoff = 50, int axis = 0, int order = 8)
  15. {
  16. try
  17. {
  18. Runtime.PythonDLL = Path.Combine(PathToPythonDir, DllOfPython);
  19.  
  20. PythonEngine.Initialize();
  21. using (Py.GIL())
  22. {
  23. dynamic pd = Py.Import("pandas");
  24. dynamic np = Py.Import("numpy");
  25. dynamic plt = Py.Import("matplotlib.pyplot");
  26. dynamic signal = Py.Import("scipy.signal");
  27.  
  28. dynamic data = pd.read_csv("clean_data_row.csv");
  29. int listLength = data.__len__();
  30. double wn = filterCutoff / (fs / 2.0);
  31.  
  32. PyTuple baTuple = signal.butter(order, wn, "low");
  33. dynamic b = baTuple[0];
  34. dynamic a = baTuple[1];
  35. PyObject calcData = signal.filtfilt(b, a, data, axis: axis, padlen: listLength - 1);
  36. int calcLength = data.__len__();
  37. double[][] calcDataArray = calcData.As<dynamic[]>().Select(s => (double[])s.As<double[]>()).ToArray();
  38.  
  39. plt.figure(figsize: new dynamic[] { 12, 6 });
  40.  
  41. // 原始数据
  42. plt.subplot(1, 2, 1);
  43. plt.plot(np.arange(listLength), data);
  44. plt.title("Original Datas");
  45.  
  46. // 低通滤波
  47. plt.subplot(1, 2, 2);
  48. plt.plot(np.arange(calcLength), calcData);
  49. plt.title("Butterworth Lowpas Datas");
  50.  
  51. // 布局调整,防止重叠
  52. plt.tight_layout();
  53. // 显示图表
  54. plt.show();
  55. }
  56. }
  57. catch (Exception e)
  58. {
  59. Console.WriteLine("报错了:" + e.Message + "\r\n" + e.StackTrace);
  60. }
  61. }
  62.  
  63. /// <summary>
  64. /// 读取CSV数据
  65. /// </summary>
  66. /// <param name="filePath">文件路径</param>
  67. /// <returns>文件中数据集合,都是double类型</returns>
  68. static List<double[]> ReadCsvWithCsvHelper(string filePath)
  69. {
  70. using (var reader = new StreamReader(filePath))
  71. using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
  72. {
  73. var result = new List<double[]>();
  74. // 如果你的CSV文件有标题行,可以调用ReadHeader来读取它们
  75. csv.Read();
  76. csv.ReadHeader();
  77. while (csv.Read())
  78. {
  79. result.Add(new double[] {
  80. csv.GetField<double>(0),
  81. csv.GetField<double>(1),
  82. csv.GetField<double>(2),
  83. });
  84. }
  85. return result;
  86. }
  87. }
  88. }

以下是运行后结果,左边是原始数据折线图,右边是执行Butter-worth低通滤波后数据折线图

源代码:https://gitee.com/Karl_Albright/csharp-demo/tree/master/PythonnetDemo/PythonnetButterworth

C# pythonnet(3)_Butter-worth低通滤波的更多相关文章

  1. python实现直方图均衡化,理想高通滤波与高斯低通滤波

    写在前面 HIT大三上学期视听觉信号处理课程中视觉部分的实验二,经过和学长们实验的对比发现每一级实验要求都不一样,因此这里标明了是2019年秋季学期的视觉实验二. 由于时间紧张,代码没有进行任何优化, ...

  2. OpenCV计算机视觉学习(10)——图像变换(傅里叶变换,高通滤波,低通滤波)

    如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 在数 ...

  3. 跟我学Python图像处理丨傅里叶变换之高通滤波和低通滤波

    摘要:本文讲解基于傅里叶变换的高通滤波和低通滤波. 本文分享自华为云社区<[Python图像处理] 二十三.傅里叶变换之高通滤波和低通滤波>,作者:eastmount . 一.高通滤波 傅 ...

  4. 图像处理------Mean Shift滤波(边缘保留的低通滤波)

    一:Mean Shift算法介绍 Mean Shift是一种聚类算法,在数据挖掘,图像提取,视频对象跟踪中都有应用.本文 重要演示Mean Shift算法来实现图像的低通边缘保留滤波效果.其处理以后的 ...

  5. blur()低通滤波

    blur()函数可以用标准化的盒式过滤器来平滑图像. C++ API: 相关官网资料: https://docs.opencv.org/3.4.1/d4/d86/group__imgproc__fil ...

  6. 机器学习进阶-直方图与傅里叶变换-傅里叶变换(高低通滤波) 1.cv2.dft(进行傅里叶变化) 2.np.fft.fftshift(将低频移动到图像的中心) 3.cv2.magnitude(计算矩阵的加和平方根) 4.np.fft.ifftshift(将低频和高频移动到原来位置) 5.cv2.idft(傅里叶逆变换)

    1. cv2.dft(img, cv2.DFT_COMPLEX_OUTPUT) 进行傅里叶变化 参数说明: img表示输入的图片, cv2.DFT_COMPLEX_OUTPUT表示进行傅里叶变化的方法 ...

  7. OpenCV笔记(4)(直方图、傅里叶变换、高低通滤波)

    一.直方图 用于统计图片中各像素值: # 画一个图像各通道的直方图 def draw_hist(img): color = ('b', 'g', 'r') for i, col in enumerat ...

  8. 带通滤波 matlab

    巴特沃斯:1.带阻滤波器设计带阻滤波器指标:阻带上边界频率:5Kz:阻带下边界频率:7Kz:通带上边界频率:2Kz:通带下边界频率:9Kz:通带最大衰减:1dB:阻带最小衰减:20dB:设计程序如下: ...

  9. 学习 opencv---(7) 线性邻域滤波专场:方框滤波,均值滤波,高斯滤波

    本篇文章中,我们一起仔细探讨了OpenCV图像处理技术中比较热门的图像滤波操作.图像滤波系列文章浅墨准备花两次更新的时间来讲,此为上篇,为大家剖析了"方框滤波","均值滤 ...

  10. [Voice communications] 声音的滤波

    本系列文章主要是介绍 Web Audio API 的相关知识,以及 web语音通信 中会遇到的一些问题,阐述可能存在错误,还请多多斧正! 通过设备获取音频流会不可避免的渗入一些杂音,这些杂音可能来自你 ...

随机推荐

  1. Docker部署Scrapy-redis分布式爬虫框架(整合Selenium+Headless Chrome网页渲染)

    前言 我的京东价格监控网站需要不间断爬取京东商品页面,爬虫模块我采用了Scrapy+selenium+Headless Chrome的方式进行商品信息的采集. 由于最近爬虫用的服务器到期,需要换到新服 ...

  2. CMS垃圾收集器小实验之CMSInitiatingOccupancyFraction参数

    CMS垃圾收集器小实验之CMSInitiatingOccupancyFraction参数 背景 测试CMSInitiatingOccupancyFraction参数,测试结果和我的预期不符,所以花了一 ...

  3. CINN 中子图编译缓存机制

    采用 「问-答」形式记录研读 CINN 开源框架的笔记 Q:CINN中子图编译的入口是在哪里? for (const auto& node_vec : clusters) { // <- ...

  4. 从零开始写 Docker(十四)---重构:实现容器间 rootfs 隔离

    本文为从零开始写 Docker 系列第十四篇,实现容器间的 rootfs 隔离,使得多个容器间互不影响. 完整代码见:https://github.com/lixd/mydocker 欢迎 Star ...

  5. Splashtop调查显示:居家办公生产效率更高

    抱歉,本文又是个吃瓜新闻.不得不发,你懂得~ 端午节要到了,应该请大家赛龙舟,吃粽子来着. 研究表明,即使文字顺序打乱,读者都还是能毫无障碍地读懂一篇文章.或许,大家只是一目十行的看一下主要关键词就可 ...

  6. 定了!航天科技AIRIOT 物联网平台新品发布会,6月6日北京见!

    AIRIOT新品发布会预告 航天科技定档6月6日举办AIRIOT新品发布会,诚邀大家共同见证4.0版本的创新与赋能! 活动地点:北京雍和航星科技园. 现场参会请通过下方长图二维码进行报名! 亦可预约直 ...

  7. AIRIOT物联网低代码平台如何配置三菱PLC驱动?

    三菱PLC驱动配置使用三菱Melsec协议(MC协议)从三菱PLC读取数据,仅支持以太网方式.三菱PLC都可以通过此协议访问,但是需要对PLC进行设置. AIRIOT物联网低代码平台如何配置三菱PLC ...

  8. mongodb单个服务部署

    mongodb3.2.8安装步骤: 1.系统准备 (1)redhat或cnetos6.2以上系统 (2)系统开发包完整 (3)ip地址和hosts文件解析正常 (4)iptables防火墙&S ...

  9. 腾讯蓝鲸平台部署v5.1版本[去坑]

    腾讯蓝鲸平台部署 1. 环境准备 #1. 基础优化 ulimit -SHn 655360 yum remove mysql-devel -y && yum install mysql- ...

  10. 《剑指offer - 题目1》

    题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 ...