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