如何验证下采样是否符合预期

2024-09-29 01:35:03 发布

您现在位置:Python中文网/ 问答频道 /正文

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

对验证有什么想法吗

代码

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

Tags: 代码importsignalasnprespltfs
3条回答

如果对一个信号进行下采样,两个信号仍将具有完全相同的值和给定的时间,因此只需循环“time”并检查值是否相同。在你的情况下,抽样率从100到50。假设你有1秒的数据从fs中生成x,然后以1/50的增量循环t=0到t=1,确保Yd(t)=Ys(t),其中Yd d是下采样f,Ys是原始采样频率。或者简单地说,Yd(n)=Ys(2n),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()

enter image description here

音调仍然是10。你知道吗

绘制数据是一个很好的验证的第一步。这里我用直线连接的点作了规则的绘图。这些线很有用,因为它们为您提供了下采样数据所在位置的指南,还强调了下采样数据缺少的内容。(也可以只显示原始数据的线条,但是线条,就像干图一样,太混乱了,imho。)

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时,应该尝试将计算矢量化。你知道吗

相关问题 更多 >