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)この実装は正しいですか?なぜですか?

画像: ここに画像の説明を入力してください

何か間違ったことを教えてください!これらの変換は、純粋な正弦波(図のコード)から取得されます。右から、fftfreqzを見ることができます。マナーは上と(左)前に説明したように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を使用してください)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です