C# pythonnet(3)_Butter-worth低通滤波
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低通滤波的更多相关文章
- python实现直方图均衡化,理想高通滤波与高斯低通滤波
写在前面 HIT大三上学期视听觉信号处理课程中视觉部分的实验二,经过和学长们实验的对比发现每一级实验要求都不一样,因此这里标明了是2019年秋季学期的视觉实验二. 由于时间紧张,代码没有进行任何优化, ...
- OpenCV计算机视觉学习(10)——图像变换(傅里叶变换,高通滤波,低通滤波)
如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 在数 ...
- 跟我学Python图像处理丨傅里叶变换之高通滤波和低通滤波
摘要:本文讲解基于傅里叶变换的高通滤波和低通滤波. 本文分享自华为云社区<[Python图像处理] 二十三.傅里叶变换之高通滤波和低通滤波>,作者:eastmount . 一.高通滤波 傅 ...
- 图像处理------Mean Shift滤波(边缘保留的低通滤波)
一:Mean Shift算法介绍 Mean Shift是一种聚类算法,在数据挖掘,图像提取,视频对象跟踪中都有应用.本文 重要演示Mean Shift算法来实现图像的低通边缘保留滤波效果.其处理以后的 ...
- blur()低通滤波
blur()函数可以用标准化的盒式过滤器来平滑图像. C++ API: 相关官网资料: https://docs.opencv.org/3.4.1/d4/d86/group__imgproc__fil ...
- 机器学习进阶-直方图与傅里叶变换-傅里叶变换(高低通滤波) 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表示进行傅里叶变化的方法 ...
- OpenCV笔记(4)(直方图、傅里叶变换、高低通滤波)
一.直方图 用于统计图片中各像素值: # 画一个图像各通道的直方图 def draw_hist(img): color = ('b', 'g', 'r') for i, col in enumerat ...
- 带通滤波 matlab
巴特沃斯:1.带阻滤波器设计带阻滤波器指标:阻带上边界频率:5Kz:阻带下边界频率:7Kz:通带上边界频率:2Kz:通带下边界频率:9Kz:通带最大衰减:1dB:阻带最小衰减:20dB:设计程序如下: ...
- 学习 opencv---(7) 线性邻域滤波专场:方框滤波,均值滤波,高斯滤波
本篇文章中,我们一起仔细探讨了OpenCV图像处理技术中比较热门的图像滤波操作.图像滤波系列文章浅墨准备花两次更新的时间来讲,此为上篇,为大家剖析了"方框滤波","均值滤 ...
- [Voice communications] 声音的滤波
本系列文章主要是介绍 Web Audio API 的相关知识,以及 web语音通信 中会遇到的一些问题,阐述可能存在错误,还请多多斧正! 通过设备获取音频流会不可避免的渗入一些杂音,这些杂音可能来自你 ...
随机推荐
- ts小知识
在引入enum枚举的时候不需要加type import type {a} from 'b'
- 基于ADB Shell 实现的 Android TV、电视盒子万能遥控器 — ADB Remote ATV
ADB Remote ATV Android TV 的遥控器,基于 ADB Shell 命令 ADB Remote ATV 是一个 Android TV 的遥控器,基于 ADB Shell 命令,泛用 ...
- 轻松绕过 Graphql 接口爬取有米有数的商品数据
轻松绕过 Graphql 接口爬取有米有数的商品数据 有米有数数据的 API 接口,使用的是一种 API 查询语言 graphql.所有的 API 只有一个入口,具体的操作隐藏在请求数据体里面传输. ...
- Vue——基本使用
Vue.js 的核心是一个允许采用简洁的模板语法来声明式地将数据渲染进 DOM 的系统.我们不再和 HTML 直接交互了.一个 Vue 应用会将其挂载到一个 DOM 元素上 (对于这个例子是 #app ...
- 8.17考试总结(NOIP模拟42)[卷·简单题·粉丝·字符串]
你的败因只有一个,就是与我为敌. T1 卷 解题思路 乍一看,简单的树形 DP . 后来一看数据范围,发现事实并非如此.(\((10^9)^{2\times 10^5}\)????) 毕竟取 \( ...
- pandas基础--数据结构:DataFrame
从本文开始介绍pandas的相关知识. pandas含有是数据分析工作变得更快更简单的高级数据结构和操作工具,是基于numpy构建的. 本章节的代码引入pandas约定为:import pandas ...
- jquery的节点的替换 节点的克隆
// 节点的替换 / 标签的替换 // 1 , $('已有标签').replaceWith(替换的新的标签) // 替换所有 // 将已有的span ...
- npm相关命令 npm 自定义脚本命令 自动重启应用
# 初始化生成package.json文件 npm init -y[不询问] # 查看本项目已安装模块 npm list # 安装模块 npm install 模块名[@版本号 可选] 或 npm ...
- 剑指Offer-49.把字符串转换成整数(C++/Java)
题目: 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0 输入描述: 输入一个字符串,包括数字字母符号,可以为空 输出描述: 如果是合法的 ...
- C#.NET 逐行读取TXT文本
C#.NET 逐行读取TXT文本 using System; using System.IO; class Program { static void Main() { string filePath ...