Matlab - 迭代数组并附加到新数组

时间:2016-05-30 12:28:49

标签: python arrays matlab simulink

我有一个音频录音阵列,我想在它上面添加一些噪音,以后我可以在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中工作)

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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时要记住两件事而不是python:1)for循环往往相当昂贵; 2)不断地将数据附加到数组非常成本高昂,因为由于所有数组元素都存储在连续的内存中,因此每次都必须重新分配数据。所以如果你发现自己做了类似的事情:

for thing in things:
    other_thing.append(thing)

在MATLAB中,这通常是一个矩阵运算,而不是每次迭代都会改变other_thing大小的for循环。

答案 2 :(得分:0)

只需制作一份声音并添加值:

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