программирование в Matlab (как обрабатывать в реальном времени) - PullRequest
3 голосов
/ 13 июля 2011

Я пытаюсь создать спектрограмму в Matlab, вот мой код:

% Record your voice for 100 seconds.
recObj = audiorecorder;
disp('Start speaking.')
recordblocking(recObj, 100);

% Store data in double-precision array.
my= getaudiodata(recObj);
figure;
specgram(my,512);

Проблема в том, что, пока я говорю, я хочу, чтобы спектрограмма была показана, поэтому она должна обновляться, как я говорю,Как я могу построить спектрограмму, когда звук идет с микрофона?поэтому я должен иметь возможность видеть спектрограмму в режиме реального времени

Я также пробовал это

% Record your voice for 100 seconds.
recObj = audiorecorder;
disp('Start speaking.')
a=0;
figure;
while a<60
    recordblocking(recObj, 100);

    % Store data in double-precision array.
    my= getaudiodata(recObj);

    specgram(my,512);
    a=a+1;
end

, но она будет отображать спектрограмму только тогда, когда цикл while ловит рыбу (так после 60 раз выполнения)

Ответы [ 3 ]

6 голосов
/ 13 июля 2011

MATLAB по своей сути однопоточный.Только одна вещь может происходить одновременно.Это делает задачи в реальном времени несколько сложными.Как вы заметили, recordblocking не возвращает управление вашему сценарию, пока эти 100 секунд не пройдут.Ключ в слове блокирует .

Обойти это можно с помощью обратных вызовов и неблокирующих функций .Объект аудиорекордера имеет несколько методов и свойств, обеспечивающих такое поведение.

Свойства audiorecorder :
- StartFcn: установить функцию, которая будет выполняться при запускеасинхронная запись
- StopFcn: функция, выполняемая при остановке записи
- TimerFcn: функция, которая должна выполняться каждые TimerPeriod секунд во время записи.

Затемrecord метод запускает запись и обрабатывает в фоновом режиме, вызывая вышеуказанные функции в соответствии с указаниями.

Регулярно обновляя ваши данные в функции обратного вызова, вы можете обновлять свой график.К сожалению, это также нетривиально сделать эффективным способом, который учитывает живые обновления.Но это должно помочь вам начать.

4 голосов
/ 14 июля 2011

Вот одна из возможных реализаций.Основная проблема заключалась в том, что вы забыли вызвать DRAWNOW в конце каждого цикла:

Fs = 8000;                    %# sampling frequency in Hz
T = 1;                        %# length of one interval signal in sec
t = 0:1/Fs:T-1/Fs;            %# time vector
nfft = 2^nextpow2(Fs);        %# n-point DFT
numUniq = ceil((nfft+1)/2);   %# half point
f = (0:numUniq-1)'*Fs/nfft;   %'# frequency vector (one sided)

%# prepare plots
figure
hAx(1) = subplot(211);
hLine(1) = line('XData',t, 'YData',nan(size(t)), 'Color','b', 'Parent',hAx(1));
xlabel('Time (s)'), ylabel('Amplitude')
hAx(2) = subplot(212);
hLine(2) = line('XData',f, 'YData',nan(size(f)), 'Color','b', 'Parent',hAx(2));
xlabel('Frequency (Hz)'), ylabel('Magnitude (dB)')
set(hAx, 'Box','on', 'XGrid','on', 'YGrid','on')
%#specgram(sig, nfft, Fs);

%# prepare audio recording
recObj = audiorecorder(Fs,8,1);

%# Record for 10 intervals of 1sec each
disp('Start speaking...')
for i=1:10
    recordblocking(recObj, T);

    %# get data and compute FFT
    sig = getaudiodata(recObj);
    fftMag = 20*log10( abs(fft(sig,nfft)) );

    %# update plots
    set(hLine(1), 'YData',sig)
    set(hLine(2), 'YData',fftMag(1:numUniq))
    title(hAx(1), num2str(i,'Interval = %d'))
    drawnow                   %# force MATLAB to flush any queued displays
end
disp('Done.')

screenshot

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

0 голосов
/ 13 июля 2011

Самое очевидное, что нужно сделать, это поместить ваш код в цикл, чтобы постоянно обновлять рисунок. Но имейте в виду, что Matlab на самом деле не предназначен для такого рода задач, поэтому я не знаю, какого успеха вы добьетесь. Вы пробовали Googling для бесплатного программного обеспечения, которое делает это для вас? Я был бы удивлен, если бы не было ничего, что не делало бы это уже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...