簡體   English   中英

Matlab-遍歷數組並追加到新數組

[英]Matlab - Iterating through an array and appending to a new one

我得到了一個錄音陣列,我想在上面添加一些噪音,以便稍后可以在Simulink中將其刪除,然后將原始聲音與刪除噪音的聲音進行比較。

我的問題是我對Matlab的語言/函數還很陌生,所以我陷入了一個for循環中,但我不了解它在Matlab中如何正常工作。

我得到了這個巨大的陣列(記錄了聲音):

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

我想做的是在每行中添加一些值,所以會很吵(另一個數組):

noise = [0.0142    0.0143]

要做到這一點,我將在python中使用偽代碼像這樣逐行執行:

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

我需要保留原件,以便以后進行比較。 你們能幫我忙嗎? 我很想知道如何在Matlab中實現它。

Obs:(這也是我嘗試從老師那里更新舊代碼,因此它可以在新的Matlab中為其他學生使用)

我喜歡Daniel的解決方案,但是需要進行一些編輯:

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

您要做的只是從舊陣列創建一個新陣列並添加噪音。 如果要將[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而不是python時,要記住兩件事:1)for循環的開銷相當大; 2)將數據不斷追加到數組上的開銷非常大,因為每次都必須重新分配數據因為所有數組元素都存儲在連續內存中。 因此,如果您發現自己正在執行以下操作:

for thing in things:
    other_thing.append(thing)

在MATLAB中,這通常是矩陣運算,而不是for循環,因為每次循環都會更改other_thing的大小。

只需復制語音並添加值即可:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM