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