2016-05-30 10 views
0

私はオーディオレコーディングの配列を持っています。それにノイズを追加したいので、後でSimulinkでそれを削除し、オリジナルをノイズを除去したものMatlab - 配列の繰り返しと新しいものへの追加

私の問題は、私がMatlabの言語/関数にはかなり慣れているため、forループに陥ってしまって、Matlabで正しく動作するかどうかわかりませんでした。

は、私が(音声が録音)この巨大な配列を得た:

voice = [0.0012 0.0012; 
     0.0003 0.0005; 
     (....) (....);] 

そして、私は何をしたいのですが、各ラインにいくつかの値を追加することであるので、(他の配列)ノイジーになります

私はこのような擬似コードをpythonでラインごとに行うだろうそれを行うには
noise = [0.0142 0.0143] 

new_audio = [] 
for line in voice: 
    new_line = (line+noise) 
    new_audio.append(new_line) 

私はオリジナルを維持する必要があります私は後で比較することができます。あなたは私にそれに手を差し伸べることができますか?私はMatlabでそれを実現させる方法を知りたいです。

OBS:ちょうど声のコピーを作成し、値を追加

+0

ノイズのサイズは1x2か、それともむしろ「音声」と同じですか? –

答えて

1

あなたがしたいことは、古いものから新しいアレイを作成し、ノイズを追加することです。すべての行に[0.0142, 0.0142]を追加する場合は、bsxfunを使用して、各行に操作をブロードキャストします。

noisy = bsxfun(@plus, voice, [0.0142, 0.0142]); 

は、私はあなたが実際にがが欲しいあなたのデータの各サンプルについて異なるノイズであることを考えるもの。これを行うには、ノイズマトリクスを作成して元のデータに追加するだけです。一般的に

% Create some random noise 
noise = rand(size(voice)) - 0.5; 

% Add this to your original signal 
noisy = voice + noise; 

、パイソンとは対照的に、MATLABでの作業時に覚えておくべき二つのものがあります:1)のループのためにかなりのコストがかかることになる傾向があり、2)常に配列にデータを追加することは非常にコストがかかるためでありますすべての配列要素が連続したメモリに格納されるため、毎回データを再割り当てする必要があります。あなたのような何かをして自分自身を見つけるのであれば:

for thing in things: 
    other_thing.append(thing) 

は、MATLABでは、これは一般的になり、行列演算ではなく、各反復でother_thingのサイズを変更するためのループ。

+0

私が言及したこの値はあまり価値がありませんが、背後に大きな数式がありますが、それは考えです。ありがとう、それは配列の数分を繰り返すことなく私の質問を解決しました。私はそれを追加するためにbsxfunを使いました。 –

+0

音声は33000x2の配列で、ノイズは1x2なので、単に音声を音声に加えるだけです。 –

+0

@ArthurSilvaすべてに同じ* 2つの値を追加したい場合は、最初の例を見てください。この例では 'bsxfun'を使い、あなたの変数に' [0.0142、0.0142] 'を置き換えます。 – Suever

0

を(これも、私はそれが他の学生のための新しいMATLABで動作しますので、先生からoldcodeを更新しようとしている):

new_audio = voice 
new_audio(:, 3) = noise(1) 
new_audio(:, 4) = noise(2) 
1

私はダニエルのソリューションを好むが、しかし必要ないくつかの編集があります。ここでは

new_audio = voice; 
new_audio(:,1) = new_audio(:,1) + noise(1); 
new_audio(:,2) = new_audio(:,2) + noise(2); 

は、同じ目的を達成するための代替手段です。

voice = [0.0012, 0.0012;0.0003, 0.0005; 0.0025, 0.0100]; 
noise = [0.0142,0.0142]; 
dim1Size = size(voice,1); 
dim2Size = size(voice,2); 
voiceWithNoise = zeros(dim1Size,dim2Size); 
for dim1Idx = 1:dim1Size 
    voiceWithNoise(dim1Idx,:) = voice(dim1Idx,:)+noise; 
end 
関連する問題