MATLABツールボックスのfreqz
の有限シーケンスのDTFTは、DTFTを取得する方法だと思いますシーケンスの。 freqz
は、次の周波数応答を計算できます。
H(z)=(Num)/(Den)
次のように、任意の有限シーケンスx(n)
のz変換を簡単に計算できます。
H(z)= x(0)z ^ 0 + x(1)z ^ 1 + …
上記の式で、Den
は1であることがわかります。
思い出してください:freeqz(num,den,n)
は、nポイントのステップ応答を示します。 xはx(n)のベクトルであるため、
[x1freqz, x1freqzw]=freqz(x,1,3000,"whole");
はDTFTを与える必要があります。
1)それは(上記のステートメント)正しい?多項式をシフトするとどうなりますか?なぜですか?
2番目の方法は、次のようにDTFT式を完全に計算することです。
[X, W]=me_dtft(x1",pi,3000); figure title("my") % plot(W/pi,20*log10(abs(X))); plot(W/pi,abs(X)) ax = gca; % ax.YLim = [-40 70]; xlabel("Normalized Frequency (\times\pi rad/sample)") ylabel("Magnitude (dB)") function [X, w]=me_dtft(x,whalfrange, nsample) w= linspace(-whalfrange,whalfrange,nsample); t=0:1:size(x,2)-1; X=zeros(1,size(w,2)); for i=1:1:size(w,2) X(i)=x*exp(-t*1i*w(i))"; end end
2)混乱していますが、上記のコードのパラメータt
は重要ですか?
3)この実装は正しいですか?なぜですか?
何か間違ったことを教えてください!これらの変換は、純粋な正弦波(図のコード)から取得されます。右から、fft
、freqz
を見ることができます。マナーは上と(左)前に説明したようにDTFTを説明しました。
「ジェイソンR」のコメントの後に編集:わかりました、混乱するので対数目盛も削除しました。その後、直感的にあなたは同様に、次の画像でわかるように、なぜそれらが完全に同じではないのですか(対数目盛で最後の画像を参照しますか?)?
freqz
:
[x1freqz, x1freqzw]=freqz(fliplr(XX"),1,3000,"whole"); figure title("freqz") % plot((x1freqzw/pi)-1,20*log10(abs(fftshift(x1freqz)))) plot((x1freqzw/pi)-1,abs(fftshift(x1freqz))) ax = gca; % ax.YLim = [-40 70]; ax.XTick = -1:.5:2; xlabel("Normalized Frequency (\times\pi rad/sample)") ylabel("Magnitude")
サインサンプル:
Fs=1000; Ts=1/Fs; time=0:Ts:1; Freqs=500; Xs=zeros(length(Freqs),length(time)); for i=1:length(Freqs) Xs(i,:)= cos(2*pi*Freqs(i)*time); end XX=Xs; XX=XX./ max(abs(XX)); figure;plot(time, XX); axis(([0 time(end) -1 1])); xlabel("Time (sec)"); ylabel("Singal Amp."); title("A sample audio signal"); sound(XX,Fs)
コメント
- プロットを生成する完全なスクリプトを投稿する必要があります
- 1つの違いは、コードでDTFTを-fs / 2から+ fs / 2にプロットしているのに対し、FFTは0からfsになっていることです(ただし、 " fft shitt ")すべてのコードが表示されない場合、2つのプロットの違いは丸め誤差であり、より多くのポイントを含めるか、倍精度浮動小数点数にすることで減少すると思われます。 DTFTは、サンプリングレートの整数の倍数である周波数の正弦波を作成しない限り、FFTがサンプルとなるSinc関数になることに注意してください。また、FFTをゼロパディングすることでDTFTのサンプルを取得できることも知っておいてください。
- @ DanBoschen、fftの図では、1000はfs / 2を意味しますか?
- 1000はfs、波形を意味しませんはfs / 2にあります
- @DanBoschenなぜそれら(私のDTFTとfreqz、つまり)が完全に同じではないのか説明できますか? fftをパディングすると、sincが表示されますか?
回答
使用されているlinspace関数は- 3000サンプルの場合はfs / 2から+ fs / 2であるため、+ fs / 2は2回カウントされます。対照的に、0からN-1に変化するFFTとfreqzは、2つのエンドポイントを複製しません(この場合、DCから1ビンに移動します。fsはサンプリングレートです)。したがって、サンプルの場所は完全に同じではなく、2つのfreqzメソッドで観察できる違いが生じます。
さらに、別のオプションとしてゼロパディングによってDTFTのサンプルを取得できます:fft(x、3000)。
適切な開始と停止を選択すれば問題なく機能するlinspaceの代わりに、次のようにします。
t = [0:length(x)-1] * 1 / fs
コメント
- 2番目の質問に答えるはいあなたのアプローチは正しいと思います。サンプルの場所を修正すると、結果は一致するはずです
- 'は非常にうまく機能しましたが、2番目の質問は次のとおりです。上記のコードのパラメータt、重要ですか?
- なるほど—そうですね、tの範囲はサンプルの数です。たとえば、freqzのデフォルトの512サンプルを上書きして3000にすると、同じDTFTのサンプルが増えます。とはいえ、範囲は'選択したサンプルの回答を変更しませんが、結果により多くのサンプルを提供します。たとえば、サンプルのt値がわずかに異なるために2つの異なる回答があった場合でも、どちらの場合も、同じ(連続)曲線上のわずかに異なる場所で同じDTFTが表示されていました。 (DTFTは周波数の連続関数です。)
-
t
ではなく、w
パラメーターについて説明したと思います。 'ではありませんか?t
は時報インデックスをオーバーライドする必要がありますが、インデックスは指数関数でt
とは別に駆動できます。信号のインデックスで使用されているさまざまなt
を使用できます。より適切なスキームでは、指数を計算する前にその範囲をシフトできます。' s it 'の影響? - 数式では、tはxと同じ長さである必要があります。 tのサンプル数を増やす場合は、xのサンプル数を増やす必要があります。これは、DTFTの周波数精度が高くなることを意味します(周波数に表示されるSincパターンでは、ヌルが近くなります)。 x、t、および周波数のサンプル数がすべて一致する場合、DFTを計算しています(ただし、FFTと比較すると長い道のりです—これが、サンプルを計算するためのゼロパッドFFTの方がはるかに効率的なアプローチである理由です。 DTFTの、または単にあなたが持っているようにfreqzを使用してください)