如何过滤我的嘈杂方波,以便我可以使用切比雪夫滤波器恢复我的信号

信息处理 matlab 过滤器设计 过滤
2022-02-16 03:18:56

我有一个嘈杂的方形信号作为输入,但它有很多噪音。我应该使用带通滤波器来恢复我的信号。

我知道切比雪夫滤波器是带通滤波器;但它不起作用。过滤后的数据仍然有噪声。

Chebyshev 滤波器: Chebyshev 滤波器在通带中提供比 Butterworth 滤波器更锐利的截止。Chebyshev 滤波器的一个缺点是增益最小值和最大值在截止频率以下。由于通带中的波纹,它不用于音频系统。尽管在通带中只有一个频率可用的某些应用中它要好得多,但需要消除许多其他频率。

 % I use A picoscope2000 serie for data acquisition. (MATLAB)
 ps2000_getdata;  

 % The data is saved a cha_a (MATLAB)
 cha_a = (bufferChA/1000);
  
 % Here i use the Chebyshev bandpass filter to filter the noisy data(MATLAB) 
 [A,B,C,D] = cheby2(10,40,[900 1100]/1500);
 d = designfilt('bandpassiir','FilterOrder',20, ...
'StopbandFrequency1',900,'StopbandFrequency2',1100, ...
'StopbandAttenuation',40,'SampleRate',8000);

  y= filter(d,cha_a); % convolution

  sos = ss2sos(A,B,C,D);
  fvt = fvtool(d,y,'Fs',8000);
  legend(fvt,'cheby2','designfilt')

这是幅度响应的结果: 在此处输入图像描述

这是脉冲响应: 在此处输入图像描述

我的输入数据假设是平方数据。而且当您查看输出的脉冲响应时,它看起来不像是方波信号的脉冲响应。仍然有噪音。如何调整我的过滤器?还是我用好过滤器?

3个回答

这可能无法回答您最初的问题,但它回答了您的评论,而且我的回复对于评论来说太长了。

我认为您混淆了多个不同的概念。在matlab中过滤有两个步骤,首先你设计一个过滤器,然后你使用过滤器。该行:

[A,B,C,D] = cheby2(10,40,[900 1100]/1500);

是设计过滤器的一种可能方式的示例。此示例是 Chebyshev 2 型滤波器。它使用10极对(即20阶)带通滤波器,阻带衰减40dB,采样频率为2*1500 = 3000 Samples/s,截止频率范围为900-1100Hz。

该行:

d = designfilt('bandpassiir','FilterOrder',20, ...
'StopbandFrequency1',900,'StopbandFrequency2',1100, ...
'StopbandAttenuation',40,'SampleRate',8000);

是一种完全不同的过滤器设计方式。这不一定是切比雪夫过滤器,也不一定是任何“经典”过滤器。您只需为 matlab 提供您关心的参数或约束,它会根据这些参数设计出最好的滤波器。

现在,在您的代码中,您设计了两个不同的过滤器。如果您想比较不同过滤器的性能,那也没关系。即试试这个,看看它比那个更好还是更差。但我怀疑此时你真的只需要一个或另一个,你可能不需要两者。

下一步是使用过滤器。就是这一行:

  y= filter(d,cha_a); % convolution

您没有做的事情,您可能应该做的事情是绘制过滤后的数据并将其与原始过滤器进行比较。您可以在时域或频域中执行此操作。我会从时域开始。即做这样的事情

figure;
plot( 1:length(y), cha_a, 1:length(y), y);

希望这能让您更深入地了解 matlab 过滤器的工作原理,然后也许您可以针对您的具体问题提出更集中的问题。

带通滤波不会做你所追求的。如果我采用红色光谱的无噪声方波,并为其设计一个带通滤波器(蓝色响应):

频率响应

然后将此滤波器应用于原始(浅蓝色)方波,然后我得到深蓝色响应。

已应用过滤器

我怀疑更好的方法可能是使用中值滤波器。

如果我对方波(蓝线)应用一些高斯噪声,然后应用中值滤波器(橙色图),则结果如下。

中值滤波

这些图是在 python 中生成的;我无法轻松访问 Matlab。代码如下。

from scipy import signal
import math
import numpy as np
import matplotlib.pyplot as plt

t = np.linspace(0,20*math.pi,1000)
sq = scipy.signal.square(t)

b, a = signal.cheby1(4, 0.1, [0.01, 0.2], 'bandpass')

plt.rcParams['figure.figsize'] = [20, 10]
plt.figure(1)
w, h = signal.freqz(b, a)
w2, h2 = signal.freqz(sq, 1)
plt.plot(w, abs(h)*600)
plt.plot(w2, abs(h2), color='red')


plt.figure(2)
plt.rcParams['figure.figsize'] = [20, 10]
plt.plot(t,sq)
sq_f = scipy.signal.lfilter(b,a,sq)
plt.plot(t,sq_f,color='blue')

sq_noisy = sq + np.random.normal(0,1,1000)
plt.figure(3)
plt.plot(t,sq_noisy)
sq_noisy_f = scipy.signal.medfilt(sq_noisy,21)
plt.plot(t,sq_noisy_f,color='orange')

您想使用一种称为施密特触发器的设备来滤除方波中的噪声。我将避免为您提供有关施密特触发器的教程,如果您想从事电子行业,您将需要掌握信号调理的艺术和科学。网上有很多关于这方面的信息。