2

在 Python 中,我正在尝试编写一个 algorithm 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_signalf_samplen以下是任意选择的,只是为了填写代码)

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

我的想法是,如果函数正常工作,两者的图y1y_alias都会从y_sample. 到目前为止,我完全没有成功地让函数中的 if 语句或 else 语句来做我认为应该做的事情,这让我相信要么我没有像我想要的那样理解别名,要么我的测试代码不好。

我的问题是:首先,我正在使用的测试代码是否适合我正在尝试做的事情?主要是,我正在寻找的 alias_freq 函数是什么?

另请注意:如果某些 Python 包已经内置了这样的功能,我很想听听 - 但是,我这样做的部分原因是为了给自己一个设备来更好地理解别名等现象,所以我仍然想看看我的功能应该是什么样子。

4

3 回答 3

1

我想出了我的答案,只是意识到我忘了把它贴在这里,对不起。事实证明这是一件愚蠢的事情——Antii 的回答基本上是正确的,但是我f_sample-1alias_freq函数中编写代码的方式需要 a ,而我只有一个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()
于 2015-03-10T19:07:21.403 回答
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)

这应该适用于低于和高于奈奎斯特的频率。

于 2015-02-21T20:37:32.790 回答
0

这是一个基于 numpy 的 Python 别名频率计算器

def get_aliased_freq(f, fs):
    """
    return aliased frequency of f sampled at fs
    """
    import numpy as np

    fn = fs / 2
    if np.int(f / fn) % 2 == 0:
        return f % fn
    else:
        return fn - (f % fn)
于 2018-09-15T16:30:48.703 回答