我正在开发一个应用程序,可以实时从麦克风获取源音频,无需文件存储。基本上,我使用:
mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mRecorder.setOutputFile("/dev/null");
如何在没有文件的情况下从实时音频中绘制频谱图?
我读到的所有帖子都在分析缓冲文件。
是的,这是可以做到的。
您所需要的只是一个快速 FFT 算法!
首先决定您想要的频率分辨率,例如您可以将麦克风的采样率设置为 8000hz,现在选择一个块大小(例如 1024 或 2048)来从麦克风捕获。
如果选择 2048 点和采样率 8000,则频率分辨率 = 3.9063 (8000 /2048)。
在 2048 个点上应用一个窗函数,然后应用 FFT 并获得幅度!
记住奈奎斯特定理采样率 = 8000 / 2 = 4000,现在您知道您的 FFT 可以在 4000 Hz 处获得 3.9063 Hz 之间的频率吗?
对应频率的FFT Bin:
1 -> 3,90625 hz
2 -> 7,8125 hz
3 -> 11,71875 hz
...
1024 -> 4000 hz
...
2048 - > 8000 hz
为此,您只需要 FFT 的前半值,在本例中为 1024。
现在,如果您从 FFT 中绘制这些数据,您将得到一个频谱!
EDIT
伪代码:
#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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)