как проверить правильность выбранного результата. Например, я сделал несколько примеров, однако, я не уверен, корректен ли вывод или нет?
Любая идея о валидации
Код
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()
Построение данных является хорошим первым при проверке. Здесь я сделал регулярный сюжет с точками, связанными линиями. Линии полезны, поскольку они дают руководство для того, где вы ожидаете, что данные с пониженной выборкой будут лгать, а также подчеркнуть, что отсутствуют данные с уменьшенной выборкой. (Это также будет работать только для отображения строк для исходных данных, но строки, как и в сюжетной линии, слишком запутывают, имхо.)
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
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.
Если вы подаете образец сигнала, то оба сигнала будут по-прежнему иметь то же самое значение и заданное время, поэтому просто перейдите через "время" и убедитесь, что значения одинаковы. В вашем случае вы переходите от частоты дискретизации 100 к 50. Предполагая, что у вас есть 1 секунда данных от создания x от fs, тогда просто проведите t = 0 до t = 1 с шагом 1/50'th и убедитесь, что что Yd (t) = Ys (t), где Yd d - выборка вниз, а Ys - исходная частота дискретизации. Или сказать просто Yd (n) = Ys (2n) для n = 1,2,3,... n = total_samples-1.