- 締切済み
MATLABでハニング窓関数を使わないプログラム
窓関数のハニング(hannning)を使用せずにハニング窓を掛けたいのですが上手く行きません ----------------------------------------------------- Fs = 48000; FqA = 440; FqB= 880; time = Fs / 10; n = 1:time; tone(n) = 1 * sin (2 * pi * FqA * (n-1) / Fs); n = time:Fs; tone(n) = 0; tone = repmat(tone, 1, 3) n = 3 * Fs + 1:6 * Fs; A = [ones(1, Fs) linspace(1, 0, Fs * 2)]; tone(n) = A .* sin (2 * pi * FqB * (n-1) / Fs); soundsc(tone, Fs); liner(n) = (n-1)/ time; tone_win(n) = 0.5 * (1 - cos (2 * pi * tone(n)/ (n-1)) ) .* liner ; soundsc(tone_win, Fs) figure(1) plot(tone) figure(2) plot(tone_win) ---------------------------------------------------------- tone_win(n) = 0.5 * (1 - cos (2 * pi * tone(n)/ (n-1)) ) .* liner ; の部分でエラーが出てしまいます。上記のハニング窓の式は http://en.wikipedia.org/wiki/Hann_function を参考にしました。どうすればtone(n)をハニング窓に掛けることが出来ますか? 失礼だとは重々承知ですが、急を要しているのでアドバイスの回答でしたら結構です。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- Kules
- ベストアンサー率47% (292/619)
三度Kulesです。 >失礼だとは重々承知ですが、急を要しているのでアドバイスの回答でしたら結構です。 私のことですか?(笑) ○○袋の人は親切にこたえてくれてよかったですね☆ とイヤミを書いていたら本当に消されてしまいそうなので、 本題に入ります。 tone_win(n) = 0.5 * (1 - cos (2 * pi * tone(n)/ (n-1)) ) .* liner ; ですが、おそらく「行列のサイズが異なる」とか言われているんじゃないですか? この式には少なくとも1か所致命的な間違いと、1か所のイヤな部分(表記的には怪しいけどエラーは出ないかもしれない)があります。 致命的な部分としてはlinerの要素数です。 >liner(n) = (n-1)/ time; と書いているのでlinerはnと同じサイズと思いがちですが、違います。 その前に >n = 3 * Fs + 1:6 * Fs; としているので、nは144001~288000という整数値を取っています。 すると、 >liner(n) = (n-1)/ time; というのは「linerというのはベクトルで、その144001番目から288000番目までは(n-1)/ timeにしますよ」という意味になります。 ところで、linerの1番目から144000番目はどうなっているでしょうか?まさか空行列ではありませんよね。配列のインデックスで指定する時、インデックスの最小値が1でない場合1からそこまでは0で埋められます。 したがって、linerは144000個のベクトルではなく288000個のベクトルになっているはずです。 このエラーを回避したければ、 >liner(n) = (n-1)/ time; ではなく単に >liner= (n-1)/ time; とすればよいです。これでlinerとnのサイズはそろいますので。 もう一か所 tone(n)/ (n-1)も個人的には怪しいと思う (基本的にベクトルを分母に持ってくる時は、行列の割り算つまり逆行列の掛け算になることが多いため、具体的に何が出てくるのかイメージしがたいです)けど、エラーなしで通ることもある(サイズとか他のものとの関係性次第)のでコメントは避けておきます(あなたの思っている通りの動作になっているかはわかりません。) 参考になれば幸いです。
- kmee
- ベストアンサー率55% (1857/3366)
Wikipediaにあるその式中の「N」がプログラム上で何にあたるか、よく考えてみましょう。 n ではありません。 あと、単に「エラーが出てしまいます」では何の解決にもなりません。 エラーが出たら、そのエラーメッセージを読めば、原因に近づけます。