2013-05-05 3 views
1

Я работаю над звуковым процессором, который, как предполагается, меняет высоту тона и добавляет вибрато к песне во время ее воспроизведения. Обратите внимание, что, хотя звук не живой (например, из микрофона), эффекты, которые я хочу добавить, должны выполняться в реальном времени.Как сделать MATLAB быстрее?

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

Так что я написал это, чтобы разделить аудиофайл:

%Load Sound File 
[fsample Fs] = wavread ('C:\Users\Ogulcan\Desktop\Bitirme Projesi\Codes\kravitz.wav'); 


%length of the sample 
t=length(fsample); 
%number of samples 
ns=10; 
%Defining the array: 
A=[]; 


%Create the vectors and place them into the array 'A': 

for i=1:ns-1 
    v=fsample(i*t/ns:(i+1)*t/ns); 
    A=[A;v]; 
end 

Этот код работает и делит звук в 10 образцах, однако, когда я пытаюсь играть их в цикле есть небольшая, но заметная задержка. Теперь я планирую сделать это для большего количества образцов.

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

+0

Matlab интерпретируется язык так зацикливания медленно. Это может быть причиной. Однако можете ли вы опубликовать код, который вы используете для воспроизведения образцов? –

+1

Я не думаю, что это связано со скоростью петель. Я думаю, что это проблема с 'wavplay' /' audioplayer' при попытке воспроизвести два образца назад. –

+0

@ EitanT прав: вы не можете сделать это правильно, просто используя петлю и основные функции звука MATLAB. Я считаю, что [Psychtoolbox] (http://psychtoolbox.org/) имеет звуковые функции, которые позволяют вам писать более прямо в аудиопоток, что должно позволить вам делать то, что вы хотите. – wakjah

ответ

1

Вы можете заменить весь цикл со следующей простой фрагмент кода:

A = fsample(1:end-rem(length(fsample),ns)); % ensure data has ns full samples 
A = reshape(A,[],ns)'; 
+0

, хотя это действительно более элегантный способ создания A, я подозреваю, что проблема заключается в реальном обратном воспроизведении различных образцов. –

+0

@Yair Я попробовал ваше предложение, однако я получил сообщение об ошибке, говорящее Продукт известных размеров, 10, не делится на общее число элементов, 328042. Кто-нибудь есть какие-либо идеи о том, почему это могло произойти и как Я мог бы это исправить? Заранее спасибо. (Я надеюсь, что это способ ответить на комментарии, я не мог видеть кнопку ответа) – Ocul

+0

Вот для чего первая строка - для обеспечения того, что A имеет доступное количество элементов без остатка, чтобы вы могли затем безопасно изменить его в матрицу. В вашем случае A будет иметь 328040 элементов (последние 2 будут отброшены). –

Смежные вопросы