9

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

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

我如何从这个实时音频中制作频谱图,没有文件?

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

4

3 回答 3

8

是的,可以做到。

您所需要的只是一个快速的 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
于 2013-08-19T16:33:17.660 回答
8

Github 上有一个开源的 Android 频谱分析仪,它对来自麦克风的音频进行 FFT 计算并显示 2D 频谱图。

Spectrum Analyzer 项目位于v2.x/Showcase 应用程序中

您可以在https://youtu.be/yU05fsgOYO4上观看它的视频

您可以在此处观看带有构建说明的视频:https ://youtu.be/tVgn30uss2k?t=1m37s

在此处输入图像描述

图表由商业控件SciChart Android 图表库提供,但读取麦克风、计算 FFT 和频谱图的源代码在 MIT 许可下是免费和开源的。

作为披露:我是 SciChart 项目的技术负责人

于 2017-04-21T19:39:01.933 回答
2

我开发了一个基于 FFT 的开源频谱分析仪。请看一下

http://som-itsolutions.blogspot.in/2012/01/fft-based-simple-spectrum-analyzer.html

您还可以从以下位置获取源代码

https://github.com/sommukhopadhyay/FFTBasedSpectrumAnalyzer

希望这会帮助你。

于 2014-04-07T05:25:28.687 回答