Python代码如下

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal def lowpass_Butterworth(sig,fs,filter_cutoff=None,order=8,axis=0): '''
Butter-worth低通滤波
Inputs:
sig --- numpy array, 输入时间序列数据
fs --- int, 采样率
filter_cutoff --- float, 截断频率,滤掉高于此频率的成分
order --- int, 滤波器阶次
axis --- int, 在sig的哪个轴上施加滤波
'''
if not filter_cutoff:
filter_cutoff=fs/4
b,a = signal.butter(order,filter_cutoff / (fs/2),'low')
sig = signal.filtfilt(b,a,sig,axis=axis)
return sig # 读取数据
data = pd.read_csv('clean_data_row6.csv')
data = np.array(data)
dataLen = len(data)
# Butter-worth低通滤波
fs=50 #采样频率
filter_cutoff=10 #截断频率
axis=0 #时间轴所在维度
# use_downsamping=True #是否降采样
calcData = lowpass_Butterworth(data, fs, filter_cutoff)
calcData = np.array(calcData)
calcDataLen = len(calcData) # 绘制原始数据图和Butter-worth低通滤波图
# 原始数据图
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.plot(np.arange(dataLen), np.abs(data))
plt.title('Original Datas') # Butter-worth低通滤波图
plt.subplot(1, 2, 2)
plt.plot(np.arange(calcDataLen), np.abs(calcData))
plt.title('Lowpass Butterworth Datas') plt.tight_layout()
plt.show()

下面我们修改成C#代码

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

public class Program
{
const string PathToPythonDir = "D:\\Python311";
const string DllOfPython = "python311.dll"; static void Main(string[] args)
{
// Butter-worth低通滤波
ButterworthLowpass();
}
/// <summary>
/// Butter-worth低通滤波
/// </summary>
static void ButterworthLowpass(int fs = 250, double filterCutoff = 50, int axis = 0, int order = 8)
{
try
{
Runtime.PythonDLL = Path.Combine(PathToPythonDir, DllOfPython); PythonEngine.Initialize();
using (Py.GIL())
{
dynamic pd = Py.Import("pandas");
dynamic np = Py.Import("numpy");
dynamic plt = Py.Import("matplotlib.pyplot");
dynamic signal = Py.Import("scipy.signal"); dynamic data = pd.read_csv("clean_data_row.csv");
int listLength = data.__len__();
double wn = filterCutoff / (fs / 2.0); PyTuple baTuple = signal.butter(order, wn, "low");
dynamic b = baTuple[0];
dynamic a = baTuple[1];
PyObject calcData = signal.filtfilt(b, a, data, axis: axis, padlen: listLength - 1);
int calcLength = data.__len__();
double[][] calcDataArray = calcData.As<dynamic[]>().Select(s => (double[])s.As<double[]>()).ToArray(); plt.figure(figsize: new dynamic[] { 12, 6 }); // 原始数据
plt.subplot(1, 2, 1);
plt.plot(np.arange(listLength), data);
plt.title("Original Datas"); // 低通滤波
plt.subplot(1, 2, 2);
plt.plot(np.arange(calcLength), calcData);
plt.title("Butterworth Lowpas Datas"); // 布局调整,防止重叠
plt.tight_layout();
// 显示图表
plt.show();
}
}
catch (Exception e)
{
Console.WriteLine("报错了:" + e.Message + "\r\n" + e.StackTrace);
}
} /// <summary>
/// 读取CSV数据
/// </summary>
/// <param name="filePath">文件路径</param>
/// <returns>文件中数据集合,都是double类型</returns>
static List<double[]> ReadCsvWithCsvHelper(string filePath)
{
using (var reader = new StreamReader(filePath))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
var result = new List<double[]>();
// 如果你的CSV文件有标题行,可以调用ReadHeader来读取它们
csv.Read();
csv.ReadHeader();
while (csv.Read())
{
result.Add(new double[] {
csv.GetField<double>(0),
csv.GetField<double>(1),
csv.GetField<double>(2),
});
}
return result;
}
}
}

以下是运行后结果,左边是原始数据折线图,右边是执行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. ts小知识

    在引入enum枚举的时候不需要加type import type {a} from 'b'

  2. 基于ADB Shell 实现的 Android TV、电视盒子万能遥控器 — ADB Remote ATV

    ADB Remote ATV Android TV 的遥控器,基于 ADB Shell 命令 ADB Remote ATV 是一个 Android TV 的遥控器,基于 ADB Shell 命令,泛用 ...

  3. 轻松绕过 Graphql 接口爬取有米有数的商品数据

    轻松绕过 Graphql 接口爬取有米有数的商品数据 有米有数数据的 API 接口,使用的是一种 API 查询语言 graphql.所有的 API 只有一个入口,具体的操作隐藏在请求数据体里面传输. ...

  4. Vue——基本使用

    Vue.js 的核心是一个允许采用简洁的模板语法来声明式地将数据渲染进 DOM 的系统.我们不再和 HTML 直接交互了.一个 Vue 应用会将其挂载到一个 DOM 元素上 (对于这个例子是 #app ...

  5. 8.17考试总结(NOIP模拟42)[卷·简单题·粉丝·字符串]

    你的败因只有一个,就是与我为敌. ­ T1 卷 解题思路 乍一看,简单的树形 DP . 后来一看数据范围,发现事实并非如此.(\((10^9)^{2\times 10^5}\)????) 毕竟取 \( ...

  6. pandas基础--数据结构:DataFrame

    从本文开始介绍pandas的相关知识. pandas含有是数据分析工作变得更快更简单的高级数据结构和操作工具,是基于numpy构建的. 本章节的代码引入pandas约定为:import pandas ...

  7. jquery的节点的替换 节点的克隆

      // 节点的替换 / 标签的替换         // 1 , $('已有标签').replaceWith(替换的新的标签)         // 替换所有         // 将已有的span ...

  8. npm相关命令 npm 自定义脚本命令 自动重启应用

    # 初始化生成package.json文件 npm init -y[不询问] # 查看本项目已安装模块 npm list # 安装模块 npm install 模块名[@版本号 可选]  或  npm ...

  9. 剑指Offer-49.把字符串转换成整数(C++/Java)

    题目: 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0 输入描述: 输入一个字符串,包括数字字母符号,可以为空 输出描述: 如果是合法的 ...

  10. C#.NET 逐行读取TXT文本

    C#.NET 逐行读取TXT文本 using System; using System.IO; class Program { static void Main() { string filePath ...