我正在开发一款应用程序,可实时从麦克风获取源音频,无需文件存储。基本上,我使用:
mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mRecorder.setOutputFile("/dev/null");
我的问题是,如何从这个实时音频中创建频谱图,没有文件。可以做到吗?
我读过的所有帖子都在分析缓冲文件。
谢谢,对不起我的英语。
答案 0 :(得分:6)
是的,可以做到。
您只需要快速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绘制这些数据,您将拥有一个频谱!
修改强>
伪代码:
#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
答案 1 :(得分:4)
有open source Android spectrum analyzer on Github个计算机对来自麦克风的音频进行FFT校验并显示2D谱图。
Spectrum Analyzer项目位于v2.x/Showcase app
您可以在https://youtu.be/yU05fsgOYO4
看到它的视频您可以在此处看到包含构建说明的视频:https://youtu.be/tVgn30uss2k?t=1m37s
图表由商业控件SciChart Android chart library提供,但读取麦克风,计算FFT和频谱图的源代码是免费的。麻省理工学院许可下的开源。
作为披露:我是SciChart项目的技术主管
答案 2 :(得分:2)
我开发了一种基于开源FFT的频谱分析仪。请看看
http://som-itsolutions.blogspot.in/2012/01/fft-based-simple-spectrum-analyzer.html
您还可以从
获取源代码https://github.com/sommukhopadhyay/FFTBasedSpectrumAnalyzer
希望这会对你有所帮助。