如何验证下采样是否符合预期
How to validate the downsampling is as intended
如何验证下采样输出是否正确。例如,我做了一些例子,但是我不确定输出是否正确?
关于验证的任何想法
代码
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()
如果您对信号进行向下采样,两个信号仍将具有完全相同的值和给定的 time ,因此只需遍历 "time" 并检查值是否为相同。在你的情况下,你从 100 到 50 的采样率。假设你有 1 秒的数据从 fs 构建你的 x,那么只需以 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。
重采样信号的频谱应具有与输入信号相同频率的音调,只是在较小的奈奎斯特带宽中。
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。
绘制数据是验证的良好开端。在这里,我用线连接的点制作了规则图。这些线条很有用,因为它们可以指导您预期下采样数据所在的位置,并强调下采样数据丢失的内容。 (它也可以只显示原始数据的线条,但是线条,就像在干图中一样,太混乱了,恕我直言。)
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时尝试矢量化计算。
如何验证下采样输出是否正确。例如,我做了一些例子,但是我不确定输出是否正确?
关于验证的任何想法
代码
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()
如果您对信号进行向下采样,两个信号仍将具有完全相同的值和给定的 time ,因此只需遍历 "time" 并检查值是否为相同。在你的情况下,你从 100 到 50 的采样率。假设你有 1 秒的数据从 fs 构建你的 x,那么只需以 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。
重采样信号的频谱应具有与输入信号相同频率的音调,只是在较小的奈奎斯特带宽中。
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。
绘制数据是验证的良好开端。在这里,我用线连接的点制作了规则图。这些线条很有用,因为它们可以指导您预期下采样数据所在的位置,并强调下采样数据丢失的内容。 (它也可以只显示原始数据的线条,但是线条,就像在干图中一样,太混乱了,恕我直言。)
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时尝试矢量化计算。