scilab
1len=512; 2order=200; 3sfreq=16; 4fshift=10; 5fwidth=len/sfreq; 6[x,y]=loadwave('/Users/inoguchikaede/Sound_data/mhosda01.wav'); 7n_sample=y(8); 8disp(n_sample); 9for i=1:n_sample 10 ts(i)=i/sfreq; 11end 12for i=1:len 13 win(i)=0.54-0.46*cos(2*%pi*i/len); 14end 15n_frame=0; 16for st=1:sfreq*fshift:n_sample-len 17 pwr=0; 18 for i=1:len 19 x1(i)=x(i+st)*win(i); 20 pwr=pwr+x1(i)*x1(i); 21 end 22 n_frame=n_frame+1; 23 tp(n_frame)=fwidth/2+(n_frame-1)*fshift; 24 logpwr(n_frame)=10*log10(pwr); 25end 26ここからエラーが出る-------------------------- 27thlogpwr=-25; 28for n=1:n_frame // n_frameは分析フレーム数 29 if logpwr(n) < thlogpwr then 30 f0(n)=0; 31 else 32 st=1+(n-1)*sfreq*fshift; // 現フレームの開始サンプル番号 33 j=1; 34 for l=0:order 35 36 r(j)=0; 37 for h=1:len-l 38 r(j)=r(j)+x1(h)*x1(h+l); 39 end 40 j=j+1; 41 // 42 // 43 end 44 max=0; 45 for j=80:200 46 47 argmax=max(r); 48 49 end 50 period = argmax/16; 51 f0(n) = 1000/period; 52 end 53end
ケプストラム法で音声を解析するのに自己相関関数を求めてピークを検出し,基本周波数を求めるプログラムを書いています.
長くなってしまっているのですが,ここからエラーが出ると書いたところが自己相関関数を定義してそこからピークを検出するプログラムです.
ここから下の部分において
scilab
1添字が不正です.
というエラーが出ます.具体的にどこが間違っているか分かりません.
エラーを省略しないでくださいとのコメントをいただいたのですが,特にどこが間違っているかエラーには書かれていませんでした.
個人的にmaxのところが違うのではないかと考えてr(j)にしてみたりしたのですが,同じエラーが出ました.
非常に初歩的な質問になるのですが,今のmax関数の定義で言うとr(80)からr(200)の最大値がargmaxに入るという考えてあっていますか?
よろしくお願いいたします.
追記
この質問ですが質問の意図を伝え忘れていました.
max=0がおかしいと言うことですが,最初にmaxに初期値の値を入れておくことはできませんか?
あと今のプログラムだとargmaxに最大値の値が入っていると思うのですが,私が入れたいのは,最大値の値ではなく,そのときのr(j)のjのでした.つまり,r(80)からr(200)の中で最大値の位置です.
自分の理解不足で違う意図の質問をしてしまっていました.申し訳ございません.
max関数は第二引数で最大値のインデックスを返すと言うことなので,プログラムを修正してみたのですが,max=0でエラーが出ます.
scilab
1 2 max=0; 3 for j=80:200 4 5 [z,argmax]=max(r(80:200)); 6 7 end 8 9エラー 10実行されたファイルの 103 行目 11/Users/ 12 13Wrong number of output arguments.
私の問題と意図としてはr(j)のj=80から200の最大値の位置をargmaxに入れたいです.
回答1件
あなたの回答
tips
プレビュー