C#中高通滤波器无衰减问题及指定参数代码适配咨询
问题描述
我生成了时长10秒的1Hz正弦波形,将其通过截止频率3Hz的二阶高通滤波器,保存为CSV后用Python绘图,发现信号几乎未衰减,但相同流程在Python中可正常衰减。我使用MathNet.Filtering的OnlineFilter.CreateHighpass方法,尝试替换为ImpulseResponse.Infinite后数值持续递增,未得到衰减正弦波形。现需适配以下参数修改代码:
- stopbandFreq = 1.0
- passbandFreq = 4.0
- passbandRipple = 1.0
- stopbandAttenuation = -20.0
当前C#代码
using System; using MathNet.Filtering; using MathNet.Numerics; using System.IO; using System.Globalization; class Program { const double sampleFreq = 600; const double amplitude = 100; const double frequency = 1; const double duration = 10; const double samplePeriod = 1.0 / sampleFreq; const double cutOffFrequency = 3; const int filterOrder = 2; static void Main(string[] args) { var sampleCount = sampleFreq * duration; var signal = Generate.Sinusoidal((int)sampleCount, sampleFreq, frequency, amplitude); var filter = OnlineFilter.CreateHighpass(ImpulseResponse.Finite, sampleFreq, cutOffFrequency, filterOrder); var filteredSignal = filter.ProcessSamples(signal); string path = "data_csharp.csv"; string header = "Time,RawData_uV,FilteredRawData_uV"; using (StreamWriter sw = new StreamWriter(path)) { sw.WriteLine(header); for (int i = 0; i < sampleCount; i++) { DateTime datetime = DateTime.Now.AddSeconds(i * samplePeriod); sw.WriteLine(String.Format("{0},{1},{2}", datetime.ToString("yyyy/MM/dd HH:mm:ss.fff", CultureInfo.CurrentCulture), signal[i], filteredSignal[i])); } } } }
对比用Python代码
import numpy as np from scipy import signal import pandas as pd from datetime import datetime, timedelta # from matplotlib import pyplot as plt def generate_dummy_signal(frequency, amplitude, duration, sample_rate): time = np.arange(0, duration, 1/sample_rate) signal = amplitude * np.sin(2 * np.pi * frequency * time) return time, signal def apply_hpf(input_signal, cutoff_frequency, sample_rate, order): b, a = signal.butter(order, cutoff_frequency, btype='high', analog=False, fs=sample_rate) filtered_signal = signal.lfilter(b, a, input_signal) return filtered_signal # Constants FREQUENCY = 1 # in Hz AMPLITUDE = 100 # in µV DURATION = 10 # in seconds SAMPLE_RATE = 600 # in Hz CUTOFF_FREQUENCY = 3 # in Hz ORDER = 2 # order of the filter # Generate the dummy signal time, raw_signal = generate_dummy_signal(FREQUENCY, AMPLITUDE, DURATION, SAMPLE_RATE) # Apply the HPF filtered_signal = apply_hpf(raw_signal, CUTOFF_FREQUENCY, SAMPLE_RATE, ORDER) # Generate time-series starting from current timestamp timestamps = [datetime.now() + timedelta(seconds=time[i]) for i in range(len(time))] # Create dictionary for creating DataFrame data_dict = { 'Time': timestamps, 'RawData_uV': raw_signal, 'FilteredRawData_uV': filtered_signal } # Create DataFrame data_df = pd.DataFrame(data_dict) # Write DataFrame to CSV data_df.to_csv('data.csv', index=False)
绘图结果
- C#生成CSV的Python绘图:

- C#使用
ImpulseResponse.Infinite的绘图:
- Python生成CSV的绘图:

内容的提问来源于stack exchange,提问作者Ganessa
相关产品推荐
相关产品推荐

