如何验证降采样是预期的

时间:2018-10-11 04:54:08

标签: python validation signal-processing resampling

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

关于验证的任何想法

代码

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()

3 个答案:

答案 0 :(得分:1)

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

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()

enter image description here

声音仍然是10。

答案 1 :(得分:1)

绘制数据是进行验证的第一步。在这里,我用线连接点进行了常规绘图。这些行很有用,因为它们为您提供了希望将下采样数据放置在何处的指南,并且还强调了缺少下采样数据的地方。 (只显示原始数据的线也是可行的,但是像干图中一样,线太混乱了,恕我直言。)

enter image description here

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 :(得分:0)

如果您对信号进行下采样,则两个信号仍将具有完全相同的值和给定的 time ,因此只需循环遍历“时间”并检查值是否相同。在您的情况下,您从100的采样率变为50。假设从fs建立x可获得1秒的数据价值,然后以1/50的增量循环遍历t = 0到t = 1,并确保Yd(t)= Ys(t)其中Yd d是向下采样的f,Ys是原始采样的频率。换句话说,对于n = 1,2,3,... n = total_samples-1,它仅是Yd(n)= Ys(2n)。