Как проверить понижающую дискретизацию, как задумано

1

как проверить правильность выбранного результата. Например, я сделал несколько примеров, однако, я не уверен, корректен ли вывод или нет?

Любая идея о валидации

Код

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()
Теги:
validation
signal-processing
resampling

3 ответа

1
Лучший ответ

Построение данных является хорошим первым при проверке. Здесь я сделал регулярный сюжет с точками, связанными линиями. Линии полезны, поскольку они дают руководство для того, где вы ожидаете, что данные с пониженной выборкой будут лгать, а также подчеркнуть, что отсутствуют данные с уменьшенной выборкой. (Это также будет работать только для отображения строк для исходных данных, но строки, как и в сюжетной линии, слишком запутывают, имхо.)

Изображение 174551

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.

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

Изображение 174551

Тон все еще на 10.

  • 0
    Спасибо за объяснение, действительно ценю это
0

Если вы подаете образец сигнала, то оба сигнала будут по-прежнему иметь то же самое значение и заданное время, поэтому просто перейдите через "время" и убедитесь, что значения одинаковы. В вашем случае вы переходите от частоты дискретизации 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.

  • 0
    Я согласен с вами, значение должно быть таким же после образца вниз. Однако, как показано на рисунке (с использованием прилагаемого кода), значение пониженной дискретизации несколько странное. Вы показываете с примером кода. Действительно ценю это
  • 0
    Какая фигура? Я не вижу прикрепленных изображений
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню