2011-07-13 8 views
0

私はこれを書いて、基本的にリアルタイムでスペクトログラムを更新しました。このMATLABコードを実行すると、レコーダーが空白になるのはなぜですか?

function spec(Fs, n_bits, n_channels, update_rate) 
%# Initialise default parameters if not supplied 
if (~exist('Fs', 'var')) 
    Fs   = 44000; 
end 
if (~exist('n_bits', 'var')) 
    n_bits  = 16; 
end 
if (~exist('n_channels', 'var')) 
    n_channels = 2; 
end 
if (~exist('update_rate', 'var')) 
    update_rate = 5; 
end 
plot_colors = hsv(n_channels); 

%# Initialise plots, one above each other in a single figure window 
figure; 

%# Time Domain plot 
hold on 

%# Setup the audiorecorder which will acquire data off default soundcard 
audio_recorder = audiorecorder(Fs, n_bits, n_channels); 

set(audio_recorder, 'TimerFcn', {@audioRecorderTimerCallback, ... 
            audio_recorder}); 
set(audio_recorder, 'TimerPeriod', 1/update_rate); 
set(audio_recorder, 'BufferLength', 1/update_rate); 

%# Start the recorder 
record(audio_recorder); 

end 

function audioRecorderTimerCallback(obj, event, audio_recorder) 

Fs   = get(obj, 'SampleRate'); 
num_channels = get(obj, 'NumberOfChannels'); 
num_bits  = get(obj, 'BitsPerSample'); 

try 
    if (num_bits == 8) 
     data_format = 'int8'; 
    elseif (num_bits == 16) 
     data_format = 'int16'; 
    elseif (num_bits == 32) 
     data_format = 'double'; 
    else 
     error('Unsupported sample size of %d bits', num_bits); 
    end 

    %# stop the recorder, grab the data, restart the recorder. May miss some data 
    stop(obj); 
    data = getaudiodata(obj, data_format); 

    record(obj); 

    if (size(data, 2) ~= num_channels) 
     error('Soundcard does not support acquisition of %d channels', ... 
       length(num_channels)) 
    end 
    data_fft = fft(double(data));   
    specgram(data_fft,512);     
catch 
    %# Stop the recorder and exit 
    stop(obj) 
    rethrow(lasterror) 
end  
drawnow; 
end 

私はいつも空のレコーダーで終わります。

なぜこの問題があるのか​​分かりませんが、最初に記録しました。

+0

誰かがこのコードは、私にとって非常に有用である – Rave

+0

私を助けてください。便利な変更の1つ:コールバックでレコーダーを停止して開始しないでください。私は 'stop(obj)'と 'record(obj)'を取り除き、データの長さが連続的に増加することに注意して、単にデータを読みとることを意味します。これにより、データが欠落してしまうことを防ぐことができます。 –

+0

'stop'コマンドがバッファへの記録を中止し、' record'コマンドが新しいバッファを使用することに留意すれば、バッファは上記の修正を受けて増加し続けます。 –

答えて

0

問題は、spec関数が何も返さないため、関数が終了したときに記録したオーディオが破棄されることです。

変更関数のシグネチャ

function audio_recorder = spec(Fs, n_bits, n_channels, update_rate) 

一つのマイナーなスタイルのポイントは、あなたが(キュー恥知らずな自己宣伝)SetDefaultValueとはるかにきれいな機能のデフォルト値を設定することができるということです。

+0

@@@@ありがとうsoooo設定のデフォルト値は、私はインターネット上の例から、簡単な方法のおかげで学んだ:)また、spctrogramディスプレイの品質を向上させる方法を知っている、私はそのプロット、それはピクセルのようにほとんど見える – Rave

0

もう一つのトリックは、あなたのSPECの関数の最後にこれを追加することです:

uiwait 
set(audio_recorder, 'StopFcn','uiresume'); 
関連する問題