2011-07-13 36 views
3

我試圖使MATLAB的頻譜, 這裏是我的代碼:編程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次後)

+0

我不是matlab的專家,但你不只是需要一個循環周圍4至9?順便說一句,這被標記爲C,但我看不到關係。 –

回答

4

這是一個可能的實現。主要的問題是,你忘了在每個循環的最後調用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

的最明顯的做法是將您的代碼放在一個循環中以不斷更新數字。但是請注意,Matlab並不是專門爲這類任務設計的,所以我不知道你會獲得多少成功。你有沒有試過谷歌搜索免費軟件,爲你做到這一點?如果沒有任何東西已經沒有做到這一點,我會很驚訝。

+1

對不起,過去3天 - >我曾在C上工作過,並沒有睡太多。 終於決定切換到matlab,因爲我可以將它轉換成一個.exe 對不起,編輯。 – Rave

5

MATLAB本質上是單線程的。一次只能發生一件事。這使得實時任務有點困難。如您所述,recordblocking不會將控制權返回給您的腳本,直到這100秒過去。關鍵在於這個詞阻止了

解決方法是用callbacks and non-blocking functions。 audiorecorder對象有一些方法和屬性可以實現這種行爲。

audiorecorder properties
- StartFcn:設置將在啓動的異步記錄
執行功能 - StopFcn: - :每TimerPeriod秒要執行的功能TimerFcn該函數在停止記錄
要執行在錄製過程中。

然後record method將在後臺開始錄製和處理,按照指示調用上述功能。

通過定期更新回調函數中的數據,您可以更新您的繪圖。不幸的是,這種做法同樣不是微不足道的,只能以有效的方式進行實時更新。但是這應該讓你開始。

+0

你能告訴我一個小例子嗎 – Rave

+0

@Rave:我不打算爲你編碼。這是一個廣泛的問題,並且涉及MATLAB編程中的一些相當基本的技術。請通讀上述鏈接(特別是[程序調度基礎文檔](http://www.mathworks.com/help/techdoc/matlab_prog/f9-38012.html))。如果您在實施過程中遇到具體問題,我確信我或其他人可以爲您解答。但是StackOverflow不是代碼生成站點。 –

+0

這樣的事情。 audio_recorder = audiorecorder(Fs,n_bits,n_channels); set(audio_recorder,myfunctionAtrecord); ? 我明白如何創建它(通過閱讀文檔),但我不知道如何調用它 – Rave