• 締切済み

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

みんなの回答

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

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

Wikipediaにあるその式中の「N」がプログラム上で何にあたるか、よく考えてみましょう。 n ではありません。 あと、単に「エラーが出てしまいます」では何の解決にもなりません。 エラーが出たら、そのエラーメッセージを読めば、原因に近づけます。

関連するQ&A

  • MATLABで同じ音を鳴らす?

    MATLAB初心者なのですが、下のようなプログラムを書きました。これではラの音が1回鳴りますが、この音を0.9秒の間隔を置いて3回鳴らしたいのですが、どのようにプログラムを書けばいいのでしょうか? よろしくお願いします。 Fs = 48000; Fq_A = 440; time = Fs / 10; n = 1 : time; tone(n) = 1 * sin(2 * pi * Fq_A * (n-1) / Fs); soundsc(tone, Fs)

  • 信号に窓関数をかける?

    現在プログラム作成中なのですが、窓関数をかけるとはどういうことなのでしょうか? 例えば、信号 cos(2πfnt)が与えられているときに、これにハニング 0.5-0.5cos(2πn/(N-1))をかけろと言われたら、信号cos(2πfnt)にどんな処理をすることをいうのでしょうか? アドバイスお願いします。

  • プログラムを教えてください

    S(k)=10*log{1/N||シグマ(上N-1下n=0)s(n)h(n)exp(-j2pink/N)||^2} のプログラムを教えてください。これはパワースペクトルの式です。 N;512 h(n);ハニング窓関数で(1/2{1-cos(2pin/N)})です。s(n);オーディオ信号です。お願いします。

  • matlabできる方教えてください

    matlab初心者です。 入力信号(sin波)に階段波形をかけるプログラムをかきたいのですが、うまくいきません。 以下は、私がかいたプログラムです。 わかる方がいらっしゃいましたら回答宜しくお願いします。 clear all;close all; fs= 250; t_l=[0 1]; t=t_l(1)+1/fs:1/fs:t_l(2); X = sin(2*pi*2*t); Y = sin(2*pi*10*t); Z = stairs(X).*Y; figure stairs(t,Z)

  • ハニングマドのDTFT

    ハニング窓の式 wN[n] = 0.5 - 0.5cos(2πn/N-1) を時間領域でDTFTするとどのようになりますか?

  • MATLABの極座標を用いたアニメーション

    MATLABを用いて極座標表示するpolarとpauseを用いて簡易的なアニメーションを作っています。その際、半径RHOの大きさによって、軸のスケールが変わってしまい、どうしても見づらくなってしまいます。 plotをaxisでスケールを固定するような操作を、polarの場合はどのようにして行うことが出来るか、ご存知の方は教えてください。 以下に例を示しておきます。 t = 0:.01:2*pi; for n=1:50 A=polar(t,n*sin(2*t).*cos(2*t)); caxis([0 50]) pause(0.01) end

  • 三角関数の公式 n倍角の公式の変形

    nを0以上の整数とするとき、 2^n cos^(n+1) θ = cos (n+1)θ + Σ[k=1,n] 2^(n-k) cos^(n-k) θ cos (k-1)θ 2^n cos^(n) θ sin θ = sin (n+1)θ + Σ[k=2,n] 2^(n-k) cos^(n-k) θ sin (k-1)θ が成り立つらしいのですが、どう証明したらよいのでしょうか? なお、n=1とおくと、 2 cos^(2) θ = cos 2θ +1 , 2 cos θ sin θ = sin 2θ となり、2倍角の公式になります。 ただし、Σ[k=2,1](*)=0 です。 n=2とおくと、3倍角の公式になります。

  • グラフの描き方

    Q、キーボードからnの値を読み込み、r=sin(nθ)で表される曲線のグラフをかけ。 ヒント、x=rcosθ、y=rsinθと与えられた式で(x、y)とすればいい。また、θは度の単位で0°から360°まで計算すればよい。 この問題で、、、 SET WINDOW -1.1,1.1,-1.1,1.1 INPUT n FOR i=0 to 360 STEP 10 x=cos(n*θ*PI/180) y=sin(n*θPI/180) PLOT LINES:x,y; NEXT i END これのどこがおかしいでしょうか? おねがいします。

  • 数値解析(MATLAB)について

    vehi=[0,1,1,-1,-1,0;2,1,-1,-1,1,2]; plot(vehi(1,:),vehi(2,:));axis equal;axis([-15 15 -15 15]); [x,y]=ginput(1); hold on;plot(x,y,'p');hold off; [x1,y1]=ginput(1); hold on;plot([x x1],[y y1]);hold off; theta=atan2(y1-y,x1-x)-pi/2; R=cos(theta),-sin(theta);sin(theta),cos(theta)]; newvehi=R*vehi; hold on;plot(newvehi(1,:)+x,newvehi(2,:)+y);hold off このプログラムは実効したんでどのようになるかは分るんですが、講義で、プログラムの説明がされなかったので、全然意味が分りません。 vehiって何ですか? ginput(1)って何をしているんですか?(1)の意味って何ですか? hold onは何をしているんでしょうか? plot(x,y,'p')は何をしているんですか?pって何ですか? hold offで何をしてるんですか? theta=atan2(y1-y,x1-x)-pi/2は何をしているんですか?atan2って何ですか?アークタンジェント2? plot(newvehi(1,:)+x,newvehi(2,:)+y)って何をしてるんですか? ほとんど意味が分りません。特に、atan2とかは意味不明です。 それぞれが何をしているのか順序を追って説明をお願いします。 分りやすい解説をお願いします。

  • MATLABで円の投影データの作成

    単位円をx軸に投影するプログラムを作るのですが。 ラジアンをt=(0:100)*2*pi/100で設定し、x=cos(t),y=sin(t)をplot(x,y)で円をプロットするところまではできたのですが。 この後、radonというコマンドを使って投影をするそうなのですが、そっから先に進みません。いろいろなサイトを調べたのですが、radonの使い方が分からないのです。すいません、よろしくいお願いします。

専門家に質問してみよう