はい、できます。
必要なのは、高速な FFT アルゴリズムだけです!
最初に、必要な周波数解像度を決定します。たとえば、マイクからのサンプル レートを 8000hz に設定し、1024 または 2048 などの 1 つのチャンク サイズを選択して、マイクからキャプチャします。
2048 ポイントとサンプル レート 8000 を選択した場合、周波数分解能 = 3.9063 (8000 /2048) になりますか。
2048 ポイントに 1 つのウィンドウ関数を適用してから、FFT を適用してマグニチュードを取得します。
ナイキスト定理のサンプル レート = 8000 / 2 = 4000 を思い出してください。これで、FFT が 4000 Hz で 3.9063 Hz の間の周波数を取得できることがわかりました。
対応する周波数の FFT ビン:
1 -> 3,90625 hz
2 -> 7,8125 hz
3 -> 11,71875 hz
...
1024 -> 4000 hz
...
2048 - > 8000 hz
そのためには、FFT の前半の値、この場合は 1024 だけが必要です。
FFT からこのデータをプロットすると、スペクトルが得られます。
編集
擬似コード:
#construct one hanning window Function
Chunk = 2048;
windowed = [Chunk];
hanning = [Chunk];
for i 1:Chunk:
hanning[i] = ((1 - cos(i*2*pi/Chunk-1))/2)
#start capture from Mic
while true:
#into values capture 2048 points from your mic
values=dataFromMic(Chunk);
#Apply Window hanning = multiply window function(hanning) over your 2048 points
for i 1:Chunk:
windowed[i] = values[i] * hanning[i]
#Apply FFT
fftData=fft(windowed);
#Get Magnitude (linear scale) of first half values
Mag=abs(fftData(1:Chunk/2))
# update/show results
plot(Mag)
end