snakeemail 发表于 2023-4-3 21:32:58

请教下:假设我要采集低频信号0hz,有个100khz干扰,ADC采样率只能到10Khz,传统的数字滤波器是不是没招了?

假设我要采集低频信号0hz,有个100khz干扰,采样率只有10Khz,传统的数字滤波器是不是没招了?
即干扰信号频率 > 采样频率,IIR, FIR就不行了。


因为数字滤波器只能处理奈奎斯特频率以下的信号,以上的就混叠了。
现代滤波器有办法吗?

eric2013 发表于 2023-4-3 22:09:28

0hz ? 直流信号?

FFT提取直流信号。

snakeemail 发表于 2023-4-4 08:55:31

eric2013 发表于 2023-4-3 22:09
0hz ? 直流信号?

FFT提取直流信号。

1 我没说清楚,是采集直流
2 我的疑惑。在模拟电路里面,我加个rc滤波器,那截止频率后的信号都会衰减。
可在数字信号的领域,只有<0.5f_sample的信号,可以数字滤波后衰减,可以DFT提取幅度相位。>0.5fs的信号,在数字信号的领域内,是没有办法做任何事情的,只能看着

snakeemail 发表于 2023-4-4 09:00:26

对于数字滤波器和dft的关系我也困惑。

eric2013 发表于 2023-4-4 09:00:33

snakeemail 发表于 2023-4-4 08:55
1 我没说清楚,是采集直流
2 我的疑惑。在模拟电路里面,我加个rc滤波器,那截止频率后的信号都会衰减。 ...

数字滤波器就是这样的。

现在的抗混叠基本都是模拟电路来实现,很多ADC采样都是支持抗混叠的。其实本身就是个低通滤波器,带宽就那么大。

snakeemail 发表于 2023-4-4 09:01:40

我对时间不是太敏感,可以采集1秒的数据。

snakeemail 发表于 2023-4-4 09:05:08

sorry,手机敲的,多发了几个。谢谢版主答复。假设我对时间不敏感,只关注直流的幅度是否准确,那我是用dft好,还是用数字滤波器好,还是说我先用数字滤波器,再dft,我觉得是最后一种

ME_Engineer 发表于 2023-4-4 09:37:05

100KHz的信号,以10KHz采样,会混频到0Hz,数字滤波器肯定无能为力;但是(比如说)如果你用9KHz的采样率,100KHz会混频到1KHz,这时做DFT,把1KHz的频率成分清除掉,就只剩下直流成分了。

我还没有想明白这样做对幅值有何影响,欢迎路过的各位大虾指点。

eric2013 发表于 2023-4-4 11:30:58

snakeemail 发表于 2023-4-4 09:05
sorry,手机敲的,多发了几个。谢谢版主答复。假设我对时间不敏感,只关注直流的幅度是否准确,那我是用dft ...

FFT就行,数字滤波也没问题,现在的ADC采样本身就是个低通。你可以实际测试下。

eric2013 发表于 2023-4-4 11:33:52

ME_Engineer 发表于 2023-4-4 09:37
100KHz的信号,以10KHz采样,会混频到0Hz,数字滤波器肯定无能为力;但是(比如说)如果你用9KHz的采样率, ...

FFT有频谱泄露问题,不过对直流的幅值几乎没影响。FFT做直流提取本质就是采样数值求平均。

ME_Engineer 发表于 2023-4-4 14:09:04

其实我指的是:按照我提及的方法,去除掉1KHz的频率成分后,得到的频谱就不再是采集到的原始数据的频谱了,
如果将这个频谱IDFT变换回去,得到的是一个直流信号。
这个直流信号和没有100KHz干扰时的直流信号是一致的吗?或者说,二者幅值一样吗?

ME_Engineer 发表于 2023-4-4 14:10:59

我想了一下,应该是没有影响的。去除1KHz的频率成分后,就得到了想要的直流信号。

ME_Engineer 发表于 2023-4-4 14:14:46

做了一个脚本验证一下:

from scipy.fftpack import fft, ifft
import matplotlib.pyplot as plt
from math import sin, pi
import numpy as np

def main():
    fs1 = 10000         # Hz
    fs2 = 9000          # Hz
    f_ac = 100000       # Hz
    dc = 1.65         # v
    N = 90            # number of sample points
    ac1 =     # 0.5v sinewave, sampling in 10KHz
    ac2 =     # 0.5v sinewave, sampling in 9KHz
    signal1 = [(dc + x) for x in ac1]
    signal2 = [(dc + x) for x in ac2]

    fft_sig1 = fft(signal1)
    fft_sig2 = fft(signal2)

    # fft results - magnitude
    fft_sig1_mag = np.abs(fft_sig1)
    fft_sig2_mag = np.abs(fft_sig2)

    # remove 1khz component from spectrum
    fft_sig2 = 0.0 + 0.0j
    fft_sig2 = 0.0 + 0.0j

    fft_sig2_mag2 = np.abs(fft_sig2)

    # ifft to recover original signal
    signal1_ifft = np.real(ifft(fft_sig1))
    signal2_ifft = np.real(ifft(fft_sig2))

    fig, ax = plt.subplots(2, 2)
    ax.set_title("signal simulate")
    ax.plot(signal1, label="sig1: dc+10khz")
    ax.plot(signal2, label="sig2: dc+9khz")
    ax.set_xlim(0, N)
    ax.set_ylim(0, 3.3)
    ax.legend()
    ax.set_title("signal fft results")
    ax.plot(fft_sig1_mag, label="sig1")
    ax.plot(fft_sig2_mag, label="sig2")
    ax.legend()
    ax.set_title("sig2 remove 1khz")
    ax.plot(fft_sig1_mag, label="sig1")
    ax.plot(fft_sig2_mag2, label="sig2: remove 1khz")
    ax.legend()
    ax.set_title("after ifft")
    ax.plot(signal1_ifft, label="sig1")
    ax.plot(signal2_ifft, label="sig2")
    ax.legend()
    plt.show()

if __name__ == "__main__":
    main()

eric2013 发表于 2023-4-4 14:31:14

ME_Engineer 发表于 2023-4-4 14:14
做了一个脚本验证一下:

from scipy.fftpack import fft, ifft


混叠对直流信号没有影响,影响的主要是ADC采样的波形做FIR,IIR滤波等,截至频率前会可能有混叠的波形频率成分,这个去不掉。

而通过FFT滤波的话,他不方便像IIR FIR那样逐点输出了,FFT提取直流是把一段波形数据求平均了。他这段数据处理后都是这个值。

ME_Engineer 发表于 2023-4-4 20:23:22

对于楼主的问题,我的理解是:楼主有一个直流信号dc,这个直流信号叠加了一个100KHz的干扰信号(假定是正弦波ac),现在以10KHz的采样率采样,如何从采样结果中获取正确的直流信号幅值?

我们假设dc是1.65v,ac的幅值是0.5v、初相是pi/4,那么,如前所述,采样结果是约2.0v的直流信号,显然2.0v != 1.65v。

因此,高频信号完全可能混叠到直流信号上。

对@eric2013 所说,我的理解是:很多ADC前面都有抗混叠滤波器,抗混叠滤波器带宽有限,因此直接采集就不会有100KHz的干扰,这个取决于实际环境,得实测再说。

snakeemail 发表于 2023-4-4 21:05:25

谢谢楼上两位。
1. 在数字信号的领域,处理的是band limited的信号,这是大前提,只能模拟去滤掉100Khz。不能让100KHz混进来,靠数字滤波
2. 混叠是每隔fs,band limited信号之间的混叠,所以混叠,是下图中第一个fs左边的频率,和第0个fs右边的频率,是否交叉。
3. 采样率为9kHz, w0 * T= 2PI * 100KHz * 1/9KHz = 2PI * 11.1 = 2PI * 0.1,
即 2PI * f_analog * 1/ 9KHz =2PI * 0.1,f_analog = 0.9KHz, 即100KHz混叠回来的频率为0.9KHz。
这个思路太过清奇;P,和上面说的带限信号是冲突的。但是我不能证明这个思路,数学上哪出了问题
4. DFT由于难以避免的频谱泄露,求直流还是会受到干扰,所以还是要先数字滤波。
5. 这里有个巧合,DFT求直流,就是取N点的均值,这也是个滤波器



ME_Engineer 发表于 2023-4-5 14:39:41

采样有两种,一种是低通采样(遵守奈奎斯特-香农采样定理),一种是带通采样(我了解也不多)。带通采样时,就不是针对band-limited信号了。

设想一个射频信号,频率77~77.5GHz(带宽500MHz),要是按低通采样,你要155GHz以上的采样率才行,现在的技术水平估计很难达到。要分析这样的信号,就是带通采样,刻意利用混叠现象。

从@snakeemail 你的图中也可以看出,采样导致模拟信号的频谱发生周期延拓(术语是这个吗?),发生混频时,高频频率f_h被混叠到低频成分f_l上,有:f_l = f_h ± k f_s,其中,k是正整数,f_s是采样率,混叠后的频率位于0~f_s(或者说±f_s / 2)之间。

因此,100KHz的信号,被混叠到1KHz了:1 KHz = 100 KHz - 11 * 9 KHz。

你上面3的推导过程没有问题,但是你把1/9近似为了0.1,实际上是0.1111111...,如果不近似的话,算出来就是1KHz了。

snakeemail 发表于 2023-4-5 19:16:15

ME_Engineer 发表于 2023-4-5 14:39
采样有两种,一种是低通采样(遵守奈奎斯特-香农采样定理),一种是带通采样(我了解也不多)。带通采样时 ...

那优先改采样率为9k,然后加数字滤波器,算直流。数字滤波器的开销小。
带通采样真没学过。
这次把不少模糊的东西,搞清楚了,谢谢各位。
页: [1]
查看完整版本: 请教下:假设我要采集低频信号0hz,有个100khz干扰,ADC采样率只能到10Khz,传统的数字滤波器是不是没招了?