質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MATLAB

MATLABはMathWorksで開発された数値計算や数値の視覚化のための高水準の対話型プログラミング環境です。

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

1回答

550閲覧

z変換による周波数解析について

kaeruuuun

総合スコア19

MATLAB

MATLABはMathWorksで開発された数値計算や数値の視覚化のための高水準の対話型プログラミング環境です。

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

1クリップ

投稿2021/05/08 13:34

編集2021/05/09 13:41

matlab

1>> g=zeros(1,1000); 2>> g(1:3)=[1 1 1]; 3>> fx=fft(g); 4>> plot(20.*log10(abs(fx(1:500)))) 5

このように入力するとg=[1 1 1]のz変換が求められるのですが,なぜこのように

g=zeros(1,1000);
g(1:3)=[1 1 1];

とセットしないと正しい周波数分解能が得られないのですか?

イメージ説明

あとこれがその時に出力されたfftのグラフになるのですが,たとえばg=[1 1]であればゼロ点がz=-1でω=πのとことで応答が0になり,fs/2のところにディップが来ると思うのですが,2次の場合,z=(-1+√3i)/2,(-1-√3i)/2となるのですが,このようなグラフになる意味が理解できません.(-1+√3i)/2のゼロ点は340Hzのディップを表しているのではないかと思っているのですが,そこからどのように考えれば(-1-√3i)/2のゼロ点の位置がこのようになることを理解できますか.
質問がわかりにくいと思うので,追加すると半径1の1の単位円で考えた時にg=[1 1]でz=-1の時は単位円上に存在するのでfs/2のところにディップが来て,2枚目のグラフのように横軸の500Hzで0になっているのですが,2次になるとz=(-1+√3i)/2,(-1-√3i)/2でなぜこのようなグラフになるのか理解できません.z=(-1+√3i)/2,(-1-√3i)/2の点は単位円上にないからディップが下がりきらないのでしょうか.イメージ説明

イメージ説明
また左が元の入力信号で右が得られたg=[1 1 1]のz変換を元の入力信号と畳み込んで,fftしたグラフなのです.
g=[1 1 1]のz変換はLPFのように感じるのですが,低域が逆に下がっています.なぜかよくわかりません.
よろしくお願いいたします.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ozwk

2021/05/09 14:05 編集

z変換と言っていますが、コードは離散フーリエ変換です。 (まあz=exp(iω)としたz変換ではありますが。) ということは最初の3サンプルが1で続く997サンプルが0の方形波信号をただ離散フーリエ変換して強度をプロットしているだけなのですがそのあたり大丈夫ですか?
kaeruuuun

2021/05/09 14:05

コメントありがとうございます. 大丈夫です.
ozwk

2021/05/09 14:41

> なぜこのように > とセットしないと正しい周波数分解能が得られないのですか? むしろどうやろうとしていたのですか? g=zeros(1,1000);を抜かすとかですか?
ozwk

2021/05/09 14:42 編集

> また左が元の入力信号で右が得られたg=[1 1 1]のz変換を元の入力信号と畳み込んで,fftしたグラフなのです. 畳み込みについてもコード貼ってください
kaeruuuun

2021/05/09 23:36

g=zeros(1,1000);を抜かしたり,配列の要素が合わないので実行はできないのですが,g(1:3)=[1 1 1];の3を2にしたままで実行した場合です.
kaeruuuun

2021/05/09 23:37

畳み込みはconvを使いました.コードは以下に示すようにwavを読み込んで,wavと畳み込みしました. [x fs]=audioread('12.wav'); y=conv(g,x);
guest

回答1

0

g=zeros(1,1000);

g(1:3)=[1 1 1];
とセットしないと正しい周波数分解能が得られないのですか?

g=zeros(1,1000);を抜かしたり,配列の要素が合わないので実行はできないのですが,g(1:3)=[1 1 1];の3を2にしたままで実行した場合です.

要素がN個のデータを離散フーリエ変換したらN個のデータが得られるので
gの要素がN=3個なら当然変換結果も3つです。

配列の要素が合わないのは
g(1:2)、つまりgの要素1から2までに1 1 1を代入しようとしています。
何がしたいのでしょうか。

2次になるとz=(-1+√3i)/2,(-1-√3i)/2でなぜこのようなグラフになるのか理解できません.z=(-1+√3i)/2,(-1-√3i)/2の点は単位円上にないからディップが下がりきらないのでしょうか.

(-1±√3i)/2は単位円上の点です。
2π/3と4π/3ですね。要するに3分割。

データ数が1000個なので333.333...(と666.666...)の位置です。

投稿2021/05/10 00:35

ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kaeruuuun

2021/05/10 02:50

>>g(1:2)、つまりgの要素1から2までに[1 1 1](要素3つ)を代入しようとしています。 何がしたいのでしょうか。 とのことですが,たとえばg=zeros(1:1000)を抜かしたり,gの配列をうまく設定できなかった場合,周波数分解能がどうなるのか知りたいということです. >>(-1±√3i)/2は単位円上の点です。 2π/3と4π/3ですね。要するに3分割。 これは2π/3が333.333の位置のディップで画像では表示されていないですが4π/3が666.666の位置で同じようにディップが存在するのでしょうか. 単位円で考えると0からπで一つ目の2π/3のディップがあり,πから-πにかけてまた山が上がって4π/3でディツプが発生するのでしょうか.
jbpb0

2021/05/10 04:35 編集

質問者さん > g=zeros(1:1000)を抜かしたり,gの配列をうまく設定できなかった場合,周波数分解能がどうなるのか 上記の「周波数分解能」が、FFT結果の周波数の間隔の意味ならば、それは元データの全長さの逆数です たとえば、1秒間隔に取得したデータが10個ある場合、周波数の間隔は1/10=0.1Hzなので、FFT結果の周波数は、順番に下記の通りになります 0, 0.1, 0.2, 0.3, 0.4, 0.5, -0.4, -0.3, -0.2, -0.1 Hz 1秒間隔で100個の場合は、周波数の間隔は同様に1/100=0.01Hzなので、FFT結果の周波数は、順番に下記の通り (長いので途中は省略) 0, 0.01, 0.02...0.48, 0.49, 0.5, -0.49, -0.48...-0.02, -0.01 Hz 元データが、最初の2~3個だけが値を持ち、それ以外は0の場合は、0のデータの数を変えて、データ総数が10個、100個、1000個となるデータを作り、それぞれのFFT結果を同じグラフに重ね書きしたら、FFT結果の周波数間隔が変わることをちゃんと考慮してグラフを書けば、グラフは重なります 元々の質問文をちゃんと読んでないので、質問者さんの疑問とずれたコメントになってるかもしれません もし外したコメントなら、スルーしてください
kaeruuuun

2021/05/11 01:13

コメントありがとうございます. >>元データが、最初の2~3個だけが値を持ち、それ以外は0の場合は、0のデータの数を変えて、データ総数が10個、100個、1000個となるデータを作り、それぞれのFFT結果を同じグラフに重ね書きしたら、FFT結果の周波数間隔が変わることをちゃんと考慮してグラフを書けば、グラフは重なります たとえば元データが1000個で最初の2個だけ値を持って残りが0の場合と最初の3個だけ値を持って残りが0の場合では周波数分解能は元データの数が一緒なら変わらないですよね?
jbpb0

2021/05/11 02:38

> 周波数分解能は元データの数が一緒なら変わらないですよね? 元データのサンプリングレート(私が書いた例では1秒に1回)も同じなら、そうです
kaeruuuun

2021/05/11 03:04

わかりました. ありがとうございます.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問