2016-05-30 4 views
0

У меня есть массив, который является аудиозаписью, и я хотел бы добавить некоторый шум на него, так что позже я смогу удалить его в Simulink и сравнить оригинал с один, что я удалил шум.Matlab - Итерация через массив и добавление к новой

Моя проблема в том, что я довольно новичок в языках/функциях Matlab, поэтому я застрял в цикле for, и я не понял, как он работает правильно в Matlab.

Я получил этот огромный массив (голос записан):

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

И то, что я хотел бы сделать, это добавить некоторые значения в каждой строке, так что это будет шумным (другой массив):

noise = [0.0142 0.0143] 

, чтобы сделать это, я бы построчно в питоне с псевдокодом, как это:

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

мне нужно сохранить оригинал поэтому я могу сравнить позже. Не могли бы вы, ребята, дать мне руку? Я хотел бы знать, как это произошло в Матлабе.

Obs: (Это также я пытаюсь обновить oldcode от моего учителя, так он работает в новом Matlab для других студентов)

+0

так размер 'noise' 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 Пожалуйста, посмотрите мой первый пример, если вы хотите добавить * одинаковые * два значения ко всему. Пример с использованием 'bsxfun' и замените' [0.0142, 0.0142] 'вашей переменной. – Suever

0

Просто сделайте копию голоса и добавить значение:

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 
Смежные вопросы