• 締切済み

MATLABでの左右で時間差をつけた正弦波の再生

自分は現在MATLABを用いてプログラミングを行っています。 左右それぞれから時間差をつけて正弦波を再生して音像定位の実験を行いたいのですが、どのようにプログラミングをおこなえばいいのかよくわかりません。 現在は時間差をつける機構を実装していない状態で、 handles.x = 0.1*sin(2*pi*handles.f*t)*2.626891326; handles.y = handles.a*sin((2*pi*handles.f*handles.t)+handles.rad); z = [handles.x;handles.y]'; sound(z,handles.Fs); handles.fは周波数、handles.tは再生時間です このようにして再生しています。 このプログラムで、handles.xまたはhandles.yのどちらかを基準としてもう片方の再生開始時間を操作したいと考えています。 再生開始時間を遅らせるのにはdelayフィルタを用いようかと考えているのですが、再生開始時間を早くする方法がよくわかりません。 なにかいい方法があればご教授お願いします。

みんなの回答

  • wek00
  • ベストアンサー率62% (90/145)
回答No.1

「早くする」を「他方のを遅くする」に置き換えて場合分けするか 左0右[-n,+n]を左n右[0,+2n]に置き換える感じにすれば問題ないように思います。 時間差をつける手法としては時間の値を増減する方法もあります。 1ms遅らせるならhandles.t - 0.001(でいいよな...) もちろん同等の結果になるようhandles.radを設定するのでもOK。 再生開始時間もきっちり遅らせるなら無音になるべきところは0で上書きしてください。 関数で生成できる波形であれば、時間差が時々刻々変化する場合にも対応できます。 が、delayフィルタ(もしくは波形を格納した配列を直接操作してずらすか)でいいと思います。

関連するQ&A

  • 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)

  • Matlabでsinカーブを作成の方法(合成して)

    毎度お世話になります。 sin波形の描き方について、教えてください。 最初の1サイクルの波形はsin(2*pi*f*t)で描き次のサイクルの 波形はsin(2*pi*2*f*t)と言う様に、サイクルごとに周波数が 増加する関数をつくり、plot(t,y)で描画したいのですが、 その技法がわかりません。 下記は、途中のプログラムですが、考え方が まったく間違っている様です(無視してください) ーーーーーーーーーーーーーーーーーーーーーーー %draw sweep wave t1=0:pi/16:2*pi;  y1=sin(t1); ;----- t2=2*pi:pi/16:4*pi; y2=sin(t2); ;----- t=t1::t2;  ;t2をt1の後に連結したし y=y1::y2; ;y2をy1の後に連結したし plot(t,y);

  • MATLABでの純音提示の時間制御

    MATLABで一定間隔をおいて純音を提示することを目指しています。 その際の時間制御に関して質問があります。 現在250msごとに純音提示と無音状態を反復するプログラムを作成しています。 ticとtocを用いて純音ー無音の1サイクルに要する時間を計測しますと,0.57-0.68secの間でばたついています。可能な限り1サイクルが0.50sec付近に落ち着くようにしたいのですがどのようにすればよいでしょうか? PCのスペックなどはいじることが困難なので,出来る限りプログラミングで対応したいと考えています。 よろしくおねがいいたします。 ・MATLABのバージョン:MATLABR2007b ・導入済みのツールボックス:psychotoolbox ・作成済みプログラム f=440;%ラ音 Fs=44100 ;%サンプリング周波数 T=0.25;  %信号の長さ t=0:1/Fs:T; %公差が1/Fsで0から1までの等差数列 y=sin(2*pi*f*t); t2=0:1/Fs:0.25 %公差が1/Fsで0から1までの等差数列 y2=sin(2*pi*0*t2); for t=1:4 ; sound(y2,Fs); sound(y,Fs); end;

  • MATLABについてお聞きしたいです。

    MATLABについてお聞きしたいです。 現在勉強しているのですが、プログラミング初心者なので…。 MATLABでwavファイルの書き込みについてです。 周波数1000Hz, 0.5秒,サンプリング周波数22050Hz の設定にしてwavファイルで保存したく… f=1000; > A=0.5; > Fs=22050; > wavwrite(MyFunc_2(1000,0.5,22050),'sin1000'); という設定にして、保存したのですが、録音時に流れた音と録音された音が違うのです。 ファンクションMファイルは… function y=MyFunc_2(f,A,Fs) %Fs=44100; d=1/Fs; t=0:d:2; %f=440; %A=0.1; y=A*sin(2*pi*f*t); wavplay(y,Fs) このような設定にしています。 問題解決への協力よろしくお願いします。

  • MATLABエラー

    0.1秒かけて直線的に立ち上がり、その後0.1秒かけて直線的に減衰するような三角形の時間包絡をかけた音を作成したいのでの下記のプログラムを作りました。 1 %envelope.m 2 delta=1/48000; 3 t=delta:delta:0.1; 4 y=sin(2*pi*500*t); 5 6 t1=delta:delta:0.1; 7 env1=t1/0.1; 8 9 t2=delta:delta:0.1; 10 env2=1-t2/0.1; 11 12 env=[env;env2]; 13 z=y.*env; 14 plot(t,z); 15 16 A=0.9; 17 z=A*z; 18 sound(z,48000,16); しかし、次のようなエラーが起こりました。 行列の次元は一致しなければなりません。 エラー ==> enveplot at 13 z=y.*env; 何行目をどのように書き換えればエラーが起こらなくなりますか?

  • 正弦波の式の導出

    正弦波の式 : y = Asin{2π(t/T - x/λ) + θ} …… #1 (A : 振幅, t : 時刻, T : 周期, λ : 波長, x : 位置, θ : 初期位相, y : 変位) の導出を自分で考えて行ったのですが、どうも式が若干異なって出てしまうので、 導出過程に誤りが御座いましたら指摘して下さい。 なお、一般的な教科書などに載っているやり方は理解出来ます。 【導出過程】 波の、v-xグラフについて考えます。 y = sin(x)は、周期2πで、y = sin(ax)は周期が2π/aなので、 波長がλなので(sinの)周期をλにするには、 y = (2π/λ)x …… #2 です。 時刻t = 0、初期位相θ = 0の時、#2のグラフが波を示します。 ここで、時刻tの時、波の速度をvとすると、波はvt進むので#1のグラフを平行移動して、 y = sin (2π/λ)(x - vt) で、v = λfですから、 y = sin (2π/λ)(x - λft) = sin 2π(x/λ - ft) f = 1/Tですので、 y = sin 2π(x/λ - t/T) 従って、初期位相θ、振幅Aを考えると、 y = Asin{2π(x/λ - t/T) + θ} …… #3 となる……と思うのですが、#1と比較すると、x/λとt/Tが逆になっています。 しかも、(全てのθで)逆位相という訳でもありません。 どれだけ考えても分からないので、どうかおかしな点をご教授願います。

  • MATLAB

    matlabで for x=1:10 for y=1:10 for z=1:10 f=2*x+3*y-4*z; end end end のようなプログラムで、最大のときのfの値と、そのときのx,y,zの値を表示させるにはどのように書けばいいでしょうか?

  • matlabでのコロン演算子を用いた処理

    matlabを用いて音声処理のプログラミングを行っています handles.y(handles.sS : handles.sE) = 0; %指定区間を無音に置き換え handles.sS = 1;%無音部の開始位置1 handles.sE = (handles.sT * handles.Fs);%無音部の終了位置を計算 handles.sT = 0; %無音部の初期値0 handles.Fs = 44100; %サンプリング周波数44100Hz 上のような処理で正弦波handles.yの指定区間を無音に置換し handles.sT = handles.sT - (1/handles.f * 1/72); %無音部の値を5°分減少 上のような処理で無音時間の長さを操作しています しかし再生を行うと コロン演算子をインデックスとして使う場合、整数オペランドが必要です という警告が出てきてしまいます。コロン演算子のオペランドを整数にしたいのですが、うまい処理が思いつきません。 なにか方法があればご教授お願いします。

  • オシロスコープの正弦波の位相差について

    オシロスコープは横軸を時間でなく入力(CH1)電圧に、縦軸を入力(CH2)電圧にする(X-Yモード)ことができますが、これを利用して2つの正弦波の位相差を求めることができますよね? X-YモードでCH1,CH2に同一周期の正弦波を入力した場合の波形で楕円形をしたリサージュ図形のとき 縦軸の一番上から一番下までの長さAと y軸との切片の一番上と下の長さBから 位相差θが θ=sin^(-1)B/A   (sinの-1乗です) と求められるのは何故でしょうか?

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

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