我在 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
这很可能会在我的频谱中引入杂散频率。
研究一个可能的解决方案,会让你知道它是否有效!
