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

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

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

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

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Q&A

解決済

1回答

4320閲覧

添字が不正というエラー

kaeruuuun

総合スコア19

MATLAB

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

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

0グッド

0クリップ

投稿2021/06/01 23:34

編集2021/06/07 00:05

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に入れたいです.

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

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

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

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

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

yuki23

2021/06/01 23:45

エラーメッセージは勝手に省略せず、出力されたメッセージをそのまま質問に記載してください。 「この下のどこか」では何もわかりません
kaeruuuun

2021/06/01 23:51

コメントありがとうございます. ただ使っているのがscilabだからなのか分かりませんが,エラーメッセージからは場所が特定できなかったからこの部分だけを省略したのです. ここからエラーが出ると書いた部分より上の部分はそれだけでエラーが出なかったので,それより下だということは確認しています. --> exec('/Users/', -1) 61648. 組込み exec( /Users/ 行 -1 ) 添字が不正です.
yuki23

2021/06/02 00:15

> 今のmax関数の定義で言うとr(80)からr(200)の最大値がargmaxに入るという考えてあっていますか? 自分で書いたコードではないのでしょうか?
kaeruuuun

2021/06/02 00:17

そうです.単純なことをしているはずなのにただ,この計算がうまく行ってないような気がしています.
kaeruuuun

2021/06/02 00:19

max(r(j))とmax(r)は同じですよね?これを治しても同じエラーが出るので
kaeruuuun

2021/06/02 00:21

rまでは値が入っているのですがargmaxには値がどうしても入りません.
jbpb0

2021/06/02 05:47 編集

質問内容とは違いますが、 n_sample=y(8); って、合ってますか? https://help.scilab.org/docs/6.1.0/en_US/loadwave.html を見ると、8番目は「bytes per sample (per channel)」ってなってますが、n_sampleに入れる数値の単位は「バイト」でいいのですか? Scilab使ってないので、外してたらごめんなさい 【追記】 やっぱり外してるみたいなので、スルーしてください
kaeruuuun

2021/06/02 03:08

>jbpb0さん ありがとうございます. 承知いたしました. 実はこのプログラムはここからエラーが出ると書いたところからmax=0の上までで自己相関係数を求めています.ただ私が実現したいのは自己相関係数ではなく自己相関関数です.自己相関関数は自己相関係数を逆離散フーリエ変換したら出てくると言う認識だったので,r(j)の式の下にy(j)=ifft(r(j))としたのですが,上手く実現できませんでした.もしわかるようでしたら教えていただきたいです.
jbpb0

2021/06/02 04:05 編集

> 自己相関関数は自己相関係数を逆離散フーリエ変換したら出てくる 違いますよ 自己相関関数は、タイムラグ(遅延)を変えながら自己相関係数を計算するようなものです (いろんなタイムラグに対して、それぞれ値があるので、関数と呼ばれる) https://oceanone.hatenablog.com/entry/2020/04/13/235830 ただし、正規化するかしないかとか、細部には差異はありますが https://tmytokai.github.io/open-ed/activity/acr/text01/page01.html
kaeruuuun

2021/06/02 05:23

ありがとうございます. >自己相関関数は、タイムラグ(遅延)を変えながら自己相関係数を計算するようなものです と言うことは自己相関関数を用いて実現はできると言うことですよね?
kaeruuuun

2021/06/02 05:33

自己相関係数が自己相関関数の離散的なものというイメージだったので逆離散フーリエ変換を取れば良いのではないかと考えていました.
kaeruuuun

2021/06/02 06:19

混同していたかもしれません. >Scilabではxcorr()で自己相関関数が計算できるのでは? r(j)=xcorr(x1(h)); このように定義し直してみたのですが,計算量が多いのはあるのですがかれこれ10分以上クルクルしている状態で,間違っているような気がしています.
jbpb0

2021/06/02 06:40 編集

この質問のもともとの内容とかなりずれてきてるので、別の質問にしてください 【追記】 https://help.scilab.org/docs/6.1.0/ja_JP/xcorr.html の「例」の計算式 [c, ind] = xcorr(y, "biased"); と、 > r(j)=xcorr(x1(h)); を見比べてください 全然違いますよね 「例」の計算式には、(j), (h)みたいなもの付いてないですよね 一度、「例」の計算をそのまま自分でもやってみて、その元データ「y」の形や、計算結果「c」と「ind」の形を確認して、どのように計算させたらいいのかを理解してください
kaeruuuun

2021/06/02 06:58

承知しました. 別の質問にします.
kaeruuuun

2021/06/02 07:06

新しく質問にしました.良ければ見ていただきたいです.
jbpb0

2021/06/07 00:04

> 違う意図の質問をしてしまっていました ということなら、別の質問にした方がいいと思います 「解決済」だと、あんまり見てもらえませんし、質問文の最後の追記まで読まないと質問の意図が分からないとなると、なおさら読まれません
kaeruuuun

2021/06/07 00:06

わかりました.別の質問にします.教えていただきありがとうございます.
guest

回答1

0

ベストアンサー

matlab

1 max=0; 2 for j=80:200 3 4 argmax=max(r); 5 6 end

ここが間違っています。maxに0を代入しているので関数ではなくなってしまっています。

そもそもベクトルの最大値を求めるのにfor文を使う必要はありません。

matlab

1argmax = max(r(80:200));

投稿2021/06/02 00:32

yuki23

総合スコア1448

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

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

kaeruuuun

2021/06/02 00:50 編集

ありがとうございます. 実行はできました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問