【问题标题】:How to validate the downsampling is as intended如何验证下采样是否符合预期
【发布时间】:2019-03-16 02:07:00
【问题描述】:

如何验证下采样输出是否正确。例如,我做了一些例子,但是我不确定输出是否正确?

关于验证的任何想法

代码

import numpy as np
import matplotlib.pyplot as plt # For ploting
from scipy import signal
import mne

fs = 100 # sample rate
rsample=50 # downsample frequency
fTwo=400 # frequency of the signal
x = np.arange(fs)
y = [ np.sin(2*np.pi*fTwo * (i/fs)) for i in x]
f_res = signal.resample(y, rsample)
xnew = np.linspace(0, 100, f_res.size, endpoint=False)
#
# ##############################
#
plt.figure(1)
plt.subplot(211)
plt.stem(x, y)
plt.subplot(212)
plt.stem(xnew, f_res, 'r')
plt.show()

【问题讨论】:

    标签: python validation signal-processing resampling


    【解决方案1】:

    绘制数据是验证的第一步。在这里,我用线连接的点制作了常规图。这些线很有用,因为它们为您期望下采样数据所在的位置提供了指导,并且还强调了下采样数据缺少的内容。 (它也可以只显示原始数据的线条,但是线条,就像在茎图中一样,太令人困惑了,恕我直言。)

    import numpy as np
    import matplotlib.pyplot as plt # For ploting
    from scipy import signal
    
    fs = 100 # sample rate
    rsample=43 # downsample frequency
    fTwo=13 # frequency of the signal
    x = np.arange(fs, dtype=float)
    y = np.sin(2*np.pi*fTwo * (x/fs))
    print y
    f_res = signal.resample(y, rsample)
    xnew = np.linspace(0, 100, f_res.size, endpoint=False)
    #
    # ##############################
    #
    plt.figure()
    plt.plot(x, y, 'o')
    plt.plot(xnew, f_res, 'or')
    plt.show()
    

    一些注意事项:

    如果您尝试制定通用算法,请使用非四舍五入的数字,否则您很容易引入在偶数倍数时不会出现的错误。同样,如果你需要放大验证,去几个随机的地方,而不是,例如,只是开始。

    请注意,我将fTwo 更改为明显少于样本数。不知何故,如果你想理解它,每次振荡至少需要一个以上的数据点。

    我还删除了计算y的循环:一般来说,你应该在使用numpy时尝试向量化计算。

    【讨论】:

    • 感谢您的意见,非常感谢
    【解决方案2】:

    重采样信号的频谱应具有与输入信号相同频率的音调,只是在较小的奈奎斯特带宽内。

    import numpy as np
    import matplotlib.pyplot as plt
    from scipy import signal
    import scipy.fftpack as fft
    
    
    fs = 100 # sample rate
    rsample=50 # downsample frequency
    fTwo=10 # frequency of the signal
    
    n = np.arange(1024)
    y = np.sin(2*np.pi*fTwo/fs*n)
    y_res = signal.resample(y, len(n)/2)
    
    Y = fft.fftshift(fft.fft(y))
    f = -fs*np.arange(-512, 512)/1024
    Y_res = fft.fftshift(fft.fft(y_res, 1024))
    f_res = -fs/2*np.arange(-512, 512)/1024
    
    plt.figure(1)
    plt.subplot(211)
    plt.stem(f, abs(Y))
    plt.subplot(212)
    plt.stem(f_res, abs(Y_res))
    plt.show()
    

    音调仍然是 10。

    【讨论】:

    • 感谢您的解释,非常感谢
    【解决方案3】:

    如果您对信号进行下采样,两个信号仍将具有完全相同的值和给定的 time ,因此只需遍历“time”并检查值是否相同。在您的情况下,您从 100 到 50 的采样率。假设您从 fs 构建 x 获得了 1 秒的数据,那么只需以 1/50 的增量循环 t = 0 到 t=1 并确保Yd(t) = Ys(t) 其中 Yd d 是向下采样的 f,Ys 是原始采样频率。或者简单地说,Yd(n) = Ys(2n) for n = 1,2,3,...n=total_samples-1。

    【讨论】:

    • 我同意你的观点,下样后的值应该是一样的。但是,如图所示(使用附上的代码),下采样值的值有些奇怪。您是否使用示例代码显示。真的很感激
    • 什么数字?我没有看到任何附加图片
    • 我也不熟悉你的图形库,但我会怀疑以不同的方式构建你的 x 和 xnew。 signal.resample 不需要知道原始采样频率是多少似乎也很奇怪?要下采样,您要么需要一个比率,要么需要原始频率和样本长度,否则您的方程未完全定义
    • 您的采样率似乎低于信号的频率。 fs = 100 但 fTwo = 400。所以你将从一开始就有别名。
    • 是的,正如我在给定时间仔细比较它们所说的那样。它们在频域中不会匹配
    猜你喜欢
    • 1970-01-01
    • 2011-03-07
    • 2021-05-31
    • 2021-01-27
    • 2018-12-28
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多