python中的窗口Sinc滤波器

信息处理 过滤器 Python
2022-01-28 05:06:20

我在 PSpice 中设计了一个一阶 Delta Sigma 转换器,除了抽取滤波器。我想在 Python 中实现所述抽取过滤器,而不是在 PSpice 中。作为 Python 和过滤器的新手,我求助于谷歌,它为我提供了这个“简单”的解决方案。

解释很清楚(我认为)。在我的例子中,参数如下: - 进入 DeltaSigma ADC 的信号:1 kHz 正弦波 - DeltaSigma ADC 的采样率:5 MHz - 仿真步长:100 ns(可能相关)

当我设计我的滤波器(一个 Windowed Sinc 滤波器,如上例所示)时,我使用以下参数(我还使用了这些参数的一些变体): - 截止频率 fc = 3 kHz - 过渡带宽 1 kHz,这会导致N = 200001

注意:过滤器可能非常雄心勃勃,但据我所知,这只是一个与计算时间相关的问题。

现在,如果我在 Python 中实现上述内容,那么对于我的信号的过滤器应用程序来说,一切似乎都可以正常工作;这意味着 sinc 滤波器在图中“看起来”不错,输入信号正常,等等......

供参考:这是我的过滤器实现。

# Define the parameters
fc = 0.0006 
b = 0.0002  
N = int(np.ceil((4 / b)))
if not N % 2: N += 1  # Make sure that N is odd.
n = np.arange(N)

# Compute sinc filter.
h = np.sinc(2 * fc * (n - (N - 1) / 2.))

# Compute Blackman window.
w = np.blackman(N)

# Multiply sinc filter with window.
h = h * w

# Normalize to get unity gain.
h_unity = h / np.sum(h)

在此之后,我简单地做一个卷积:

filtered_data = np.convolve(out, h, 'valid')

过滤后的输出数据图像:

通过过滤器后的数据

我希望过滤后的数据是一个正弦波,而不是那个“东西”。

我的猜测是我遗漏了一些基本的东西,我应该以某种方式处理采样信号实际上是用 5Mhz 时钟和 100 ns 模拟时间采样的事实。

任何帮助将不胜感激!

编辑:澄清输出信号。

输出信号由 Delta Sigma 转换器生成,因此应该是“1”和“0”的流。

但是由于 PSpice 模拟器有一个内部步长(可变),输出信号的实际值有中间值(请记住:PSpice 中的输出波形是电压,因此在 0/1 之间的转换中计算电压)。

所以,我的输出信号看起来像这样(不是实际值,只是为了清楚起见):

Time    Out
0       0.000
0.1     0.000
0.145   0.123
0.167   0.679
0.2     1.000
0.3     1.000
0.4     1.000
0.45    0.875
0.493   0.439
0.560   0.293
0.6     0.000

这很可能会在我的频谱中引入杂散频率。

研究一个可能的解决方案,会让你知道它是否有效!

0个回答
没有发现任何回复~