2

私はMatlabで自分の声を録音し、それにエコーを追加するつもりです。目的のエコー効果を得るための1つの解決策を考え出しました。

  • サンプリングされたオーディオを時間領域で遅延させ、元のサンプルに追加します

これを行うために、私はMatlabを使用しており、基本的に次のことを行いました。

recObj = audiorecorder(44100, 16, 2);%sampling rate of 44100Hz, stereo
recordblocking(recObj,length);%record audio for a fixed length duration
y = time_delay(getaudiodata(recObj) , 5000 );%set a delay of 5000 to original sampled audio data

function [ y ]  = time_delay ( x , R )
%this function sets a delay to x of R
y = zeros(length(x) + R , 1);
y(R + 1:length(y)) = x(1:length(x));

ご覧のとおり、録音されたオーディオの再生に使用できるrecObjがあります。録音されたオーディオの遅延バージョンを取得するために、getaudiodata(recObj)と独自の関数time_delayを使用しました。 time_delay関数によって取得された遅延オーディオデータから新しい遅延オーディオレコーダーオブジェクトを取得する方法がわかりません。オーディオレコードオブジェクトが必要です。これが何かを再生する唯一の方法だからです。だから、私の質問は:

  • これは、オーディオ信号で目的のエコー効果を得るのに適したアプローチですか?

  • そうである場合、遅延オーディオデータをオーディオレコーダーオブジェクトに設定するにはどうすればよいですか?
4

2 に答える 2

1

2 つの信号 (遅延信号と非遅延信号) を追加するコードは次のとおりです。

    x = getaudiodata(recObj); n1 = 1:size(x,1);%audiodata of original signal
    y = time_delay(x , 50000 ); n2 = 1:size(y,1);%audiodata of delayed signal
    mixed = sigadd(x,y,n1,n2); %audiodata of mixed signal
    mixrecObj = audioplayer(mixed,44100);
    play(mixrecObj);

これは sigadd 関数です。

function [ y,n ] = sigadd( x1,x2,n1,n2 )
%implements y[n] = x1[n] + x2[n]
%y = sum sequence over n wich includes n1 and n2
%x1 = first sequence over n1
%x2 = second sequence over n2
%

n = min(min(n1),min(n2)):max(max(n1),max(n2)); %duration of y(n)
y1 = zeros(1,length(n)); y2 = y1;
y1(find((n >= min(n1))&(n <= max(n1)) == 1)) = x1;
y2(find((n >= min(n2))&(n <= max(n2)) == 1)) = x2;
y = y1 + y2;
end

これは完全に機能しますが、実際のエコー効果を得るには十分ではありません. これをアーカイブするには、さらに遅延信号を作成し (もちろん遅延は異なります)、次のようにすべてを追加する必要があります。

x = getaudiodata(recObj); n1 = 1:size(x,1);
y = tim_delay(x , 5000 ); n2 = 1:size(y,1);
s = time_delay(x , 4000 ); n3 = 1:size(s,1);
d = time_delay(x , 3000 ); n4 = 1:size(d,1);
mixed1 = sigadd(s,d,n3,n4);n5 = 1:size(mixed1,2);
mixed2 = sigadd(x,y,n1,n2);n6 = 1:size(mixed2,2);
totmixed = sigadd(mixed1,mixed2,n5,n6);
mixrecObj = audioplayer(totmixed,44100);
play(mixrecObj);

これを 3 つのディレイとオリジナルでテストしたところ、非常に素晴らしいエコーが聞こえます。

: 3 番目のコードでは、エコー エフェクト インデックスをパラメータとして渡して、エコー付きの信号を返す関数があればもっと良いのですが、簡単にするためにそのままにしました。

于 2013-03-02T17:33:58.980 に答える
0

よりリアルなエコー サウンド を得るには エコーごとに、エコーの音量を下げる必要があります。達成できる

y=y/5;

full エコーごとの音量を下げるように変更した例

recObj = audiorecorder(44100, 16, 2);%sampling rate of 44100Hz, stereo

disp('Start speaking.')
%recordblocking(recObj, 5);
recordblocking(recObj,5);%record audio for a fixed length duration
disp('End of Recording.');
x = getaudiodata(recObj);
plot(x);
hold on;

x = getaudiodata(recObj); n1 = 1:size(x,1);

s = time_delay(x , 0 ); n3 = 1:size(s,1); %original 
plot(s,'b');
d = time_delay(x , 20000 ); n4 = 1:size(d,1);%delayed by 20000
d=d/1.5;
plot(d,'y');

y = time_delay(x , 40000 ); n2 = 1:size(y,1);% delyaed by 50000
y=y/2;
plot(y,'g');

z = time_delay(x , 60000 ); n8 = 1:size(z,1);% delyaed by 70000
z=z/4;
plot(z,'r');


mixed1 = sigadd(s,d,n3,n4);n5 = 1:size(mixed1,2);
mixed2 = sigadd(y,z,n2,n8);n6 = 1:size(mixed2,2);
totmixed = sigadd(mixed1,mixed2,n5,n6);
mixrecObj = audioplayer(totmixed,44100);
%mixrecObj = audioplayer(mixed1,44100);
play(mixrecObj);
于 2016-11-05T15:35:49.157 に答える