在 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 语句执行我认为应该执行的操作,这让我相信,要么我对别名的理解没有达到我想要的程度,要么我的测试代码不好。
我的问题是:首先,我使用的测试代码对于我想要做的事情来说是合理的吗?首先,我正在寻找的 alias_freq 函数是什么?
还请注意:如果某个 Python 包已经内置了这样的功能,我很想听听它 - 然而,我这样做的部分原因是为了给自己一个理解现象的工具更喜欢别名,所以我仍然想看看我的函数应该是什么样子。
最佳答案
据我正确理解问题,混叠信号的频率为 abs(sampling_rate * n - f_signal)
,其中 n
是最接近的整数倍f_signal
。
因此:
n = round(f_signal / float(f_sample))
f_alias = abs(f_sample * n - f_signal)
这应该适用于低于和高于奈奎斯特的频率。
关于python - 算法 - 返回混叠频率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28650469/