プロが教える店舗&オフィスのセキュリティ対策術

窓関数のハニング(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)をハニング窓に掛けることが出来ますか?
失礼だとは重々承知ですが、急を要しているのでアドバイスの回答でしたら結構です。

A 回答 (2件)

三度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)も個人的には怪しいと思う
(基本的にベクトルを分母に持ってくる時は、行列の割り算つまり逆行列の掛け算になることが多いため、具体的に何が出てくるのかイメージしがたいです)けど、エラーなしで通ることもある(サイズとか他のものとの関係性次第)のでコメントは避けておきます(あなたの思っている通りの動作になっているかはわかりません。)

参考になれば幸いです。
    • good
    • 0

Wikipediaにあるその式中の「N」がプログラム上で何にあたるか、よく考えてみましょう。


n ではありません。


あと、単に「エラーが出てしまいます」では何の解決にもなりません。
エラーが出たら、そのエラーメッセージを読めば、原因に近づけます。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!