- ベストアンサー
MATLABで
MATLABで880Hzの正弦波を発振させ、1000ミリ秒間一定の音量に保ち、次の2000ミリ秒で減衰させる音を鳴らすプログラムを組みたいのですが上手く行きません。 どなたかご教授お願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
A No.1のKulesです。 補足ありがとうございます。 うーん…なんかぐっちゃぐちゃですね(笑) 1つずつ整理していきましょうか。 >Fs = 48000; >Freq = 440; >Freq2= 880; >time=Fs / 10; この時点でtime=4800ですね。 >n = 1:time; time=4800なので、nは1行4800列です。 >tone(n) = 1*sin(2*pi*Freq*(n-1)/Fs); >n = time:Fs; time=4800、Fs=48000ですので、nは1行43201列です。 >tone(n) = 0; >n = 4*Fs+1:6*Fs; 4*Fs=196000、6*Fs=288000なので、nは1行96000列です。 >A = linspace(1,0,2/44100); 2/44100は2*44100のことでしょうか?あるいは、44100/2のことでしょうか?前者の場合、Aは1行88200列、後者の場合Aは1行22050列です。 >tone(n) = A.*sin(2*pi*Freq2*(n-1)/Fs); この時点でAとnの要素数が違うので、掛け算することはできませんね。 行列のサイズを具体的に数値で書きだしてみると間違いに気付きやすいかも知れませんね。 書き直してまたエラー等でたら補足願います。 参考になれば幸いです。
その他の回答 (1)
- Kules
- ベストアンサー率47% (292/619)
前回の質問に回答したKulesです。 前回の質問は解決したんですかね? で、今回の質問ですが、前回あなたが書いたコード 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) の中で、 tone(n) = 1 * sin(2 * pi * Fq_A * (n-1) / Fs); の「1」は振幅ですよね? ここに「1000ms一定で、次の2000msで減衰」という振幅の配列を作り、掛けてやれば所望の音が出せると思います。 多分上手くいかないのは ・そのまま「*」で掛け算をしている(要素ごとの積にする必要があるので、「.*」を使います) ・振幅の配列を作れていない(要素が全て1の配列はonesで、徐々に減衰していく配列はlinspaceで作れます) 辺りでしょうか。 わからないこと等あれば補足していただければと思います。 参考になれば幸いです。
補足
早速の回答ありがとうございます。 Fs = 48000; Freq = 440; Freq2= 880; time=Fs / 10; n = 1:time; tone(n) = 1*sin(2*pi*Freq*(n-1)/Fs); n = time:Fs; tone(n) = 0; n = 4*Fs+1:6*Fs; A = linspace(1,0,2/44100); tone(n) = A.*sin(2*pi*Freq2*(n-1)/Fs); soundsc(tone,Fs); と組んでみましたが -------------------------------------------- ??? エラー ==> times 行列の次元は一致しなければなりません。 エラー ==> Untitled3 at 17 tone(n) = A.*sin(2*pi*Freq2*(n-1)/Fs); -------------------------------------------- とエラーを吐いてしまいました。 どうすればこのエラーを回避できますか?