2

alias_freq(f_signal,f_sample,n)Python では、次のように動作するアルゴリズムを作成しようとしています。

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_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 パッケージにこのような機能が既に組み込まれている場合は、それについて聞いてみたいです。 、だから私はまだ私の関数がどのように見えるべきかを見たいと思っています。

4

3 に答える 3

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 に答える
1

私は自分の答えを見つけて、ここに投稿するのを忘れていたことに気付きました、ごめんなさい。それはばかげたことであることが判明しました-Antiiの答えは基本的に正しいですが、私がコードを書いた方法はf_sample-1alias_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()
于 2015-03-10T19:07:21.403 に答える