如何从实时音频开发频谱分析仪?

时间:2013-08-17 22:39:36

标签: android audio spectrum

我正在开发一款应用程序,可实时从麦克风获取源音频,无需文件存储。基本上,我使用:

mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mRecorder.setOutputFile("/dev/null");

我的问题是,如何从这个实时音频中创建频谱图,没有文件。可以做到吗?

我读过的所有帖子都在分析缓冲文件。

谢谢,对不起我的英语。

3 个答案:

答案 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

enter image description here

图表由商业控件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

希望这会对你有所帮助。