Octave + Playrec でリアルタイムフィルタ処理

まだ Octave 分からないことが多いのですが、とりあえず書いてみました。

% $Id$

function[] = sigpow()

sample_rate = 44100;
window_size = 2048;

[recDevId, recDev] = select_rec_device;
if playrec('isInitialised')
    playrec('reset');
end
playrec('init', sample_rate, -1, recDevId)

b = fir1(100, [0.2 0.5], "pass");
fftSize = window_size * 2;
fftFigure = figure;
fftAxes = axes('parent', fftFigure, 'xlimmode', 'manual', ...
    'ylimmode', 'manual', 'xscale', 'linear', 'yscale', 'linear', ...
    'xlim', [10 sample_rate/2], 'ylim', [-100, 0]);
fftLine = line('XData', (0:(fftSize/2))*sample_rate/fftSize, ...
    'YData', ones(1, fftSize/2 + 1));

playrec('delPage');

while true
    page = playrec('rec', sample_rate, 1);
    playrec('block', page);
    [recBuffer, recChanList] = playrec('getRec', page);
    y = filter(b, 1, recBuffer(1:fftSize));
    % y = recBuffer(1:fftSize);
    recFFT = fft(y);
    set(fftLine, 'YData', 20*log10(abs(recFFT(1:fftSize/2 + 1))));
    drawnow;
    sum = y' * y / length(y);
    fprintf("pow = %.2f dB\n", log(sum)/log(10)*10);
    fflush(stdout);
end