2015-02-21 2 views
2

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

ответ

1

Насколько я понял вопрос правильно, частота сигнала с псевдонимом равна abs(sampling_rate * n - f_signal), где n - это самое близкое целое число, кратное f_signal.

Таким образом:

n = round(f_signal/float(f_sample)) 
f_alias = abs(f_sample * n - f_signal) 

Это должно работать на частотах под и над Найквиста.

+0

Спасибо за ответ. Я тоже нашел эту формулу, и я думаю, что идея состоит в том, что она должна работать для частот сигнала, превышающих частоту Найквиста, возвращая то, на что эта частота сигнала будет сглажена. Однако, когда я подключаю это в свой код, он работает только иногда. Например, с 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

1

Я понял ответ на свой вопрос и понял, что забыл его опубликовать здесь, извините. Оказывается, это было что-то глупое - ответ Антии в основном прав, но так, как я написал код, мне нужен f_sample-1 в функции alias_freq, где у меня только f_sample. Есть еще фазовый сдвиг, который случается иногда, но просто вставляя либо 0, либо pi для фазового сдвига, я работал каждый раз, я думаю, что это просто из-за четной или нечетной складчатости. Рабочая функция и тестовый код приведены ниже.

import numpy as np 
import matplotlib.pyplot as plt 

#Given a sample frequency and a signal frequency, return frequency that signal frequency will be aliased to. 
def alias_freq(f_signal,f_sample,n): 
    f_alias = np.abs((f_sample-1)*n - f_signal) 
    return f_alias 

t=np.linspace(0,2*np.pi,500) 

f_signal=13 
y1=np.sin(f_signal*t) 
plt.plot(t,y1) 

f_sample=7 
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) 

f_alias=alias_freq(f_signal,f_sample,3) 
y_alias=np.sin(f_alias*t+np.pi)#Sometimes with phase shift, usually np.pi for integer f_signal and f_sample, sometimes without. 
plt.plot(t,y_alias) 

plt.xlim(xmin=-.1,xmax=2*np.pi+.1) 
plt.show() 
Смежные вопросы