В Python, я пытаюсь написать алгоритм alias_freq(f_signal,f_sample,n)
, который ведет себя следующим образом:Алгоритм - вернуть сглаживание частоты
def alias_freq(f_signal,f_sample,n):
f_Nyquist=f_sample/2.0
if f_signal<=f_Nyquist:
return n'th frequency higher than f_signal that will alias to f_signal
else:
return frequency (lower than f_Nyquist) that f_signal will alias to
Ниже код, который я использую для тестирования функции выше (f_signal
, f_sample
и n
ниже выбираются произвольно просто заполнить код)
import numpy as np
import matplotlib.pyplot as plt
t=np.linspace(0,2*np.pi,500)
f_signal=10.0
y1=np.sin(f_signal*t)
plt.plot(t,y1)
f_sample=13.0
t_sample=np.linspace(0,int(f_sample)*(2*np.pi/f_sample),f_sample)
y_sample=np.sin(f_signal*t_sample)
plt.scatter(t_sample,y_sample)
n=2
f_alias=alias_freq(f_signal,f_sample,n)
y_alias=np.sin(f_alias*t)
plt.plot(t,y_alias)
plt.xlim(xmin=-.1,xmax=2*np.pi+.1)
plt.show()
Мое мышление является то, что если функция работает должным образом, участки как y1
и y_alias
поразит каждую разбросанную точку от y_sample
. До сих пор я был совершенно безуспешным в том, чтобы заставить оператор if или выражение else в функции делать то, что я думаю, что это должно сделать, что заставляет меня поверить, что либо я не понимаю aliasing почти так же хорошо, как я, или мой тестовый код не годится.
Мои вопросы: Предположительно, это тестовый код, который я использую для того, что я пытаюсь сделать? И в первую очередь, что такое функция alias_freq, которую я ищу?
Также обратите внимание: если в пакете Python есть функция, подобная уже встроенной, мне бы хотелось услышать об этом, однако часть причины, по которой я это делаю, - это дать мне устройство для понимания такие явления, как aliasing, так что мне все равно хотелось бы посмотреть, как должна выглядеть моя функция.
Спасибо за ответ. Я тоже нашел эту формулу, и я думаю, что идея состоит в том, что она должна работать для частот сигнала, превышающих частоту Найквиста, возвращая то, на что эта частота сигнала будет сглажена. Однако, когда я подключаю это в свой код, он работает только иногда. Например, с f_signal = 12, f_sample = 5, он отлично работает, как с sin (f_signal * t), так и с sin (f_alias * t), ударяющим все точки выборки. Но с f_signal = 14, f_sample = 5, sin (f_alias * t) больше не ударяет по всем этим точкам. Любые идеи относительно того, что происходит? – user3558855