如何使用 EZAudio 在 Swift 中获取 FFT 数据?

Posted

技术标签:

【中文标题】如何使用 EZAudio 在 Swift 中获取 FFT 数据?【英文标题】:How to get FFT Data in Swift using EZAudio? 【发布时间】:2015-10-12 08:05:57 【问题描述】:

我正在使用 ezaudio 快速进行 fft 分析。

我的问题是如何从 ezaudio 获取所有 fft 数据。

我会做一个算法来看看是出现的频率是多少。

例子:

我查看 FFT 数据是当前 2000Hz 的频率,这个频率是否存在它有多少能量。

这是我的代码:

import UIKit
import Accelerate

class ViewController: UIViewController, EZMicrophoneDelegate,     EZAudioFFTDelegate

private let ViewControllerFFTWindowSize: vDSP_Length = 4096

var microphone: EZMicrophone!
var fft: EZAudioFFTRolling!

override func loadView() 
    super.loadView()

    //setup audio session
    let session = AVAudiosession.sharedInstance()
    do
        try session.setCategory(AVAudioSessionCategoryPlayAndRecord)
        try session.setActive(true)
    catch
        print("Audio Session setup Fails")
    

    microphone = EZMicrophone(delegate: self, startsImmediately: true)
    fft = EZAudioFFTRolling(windowSize: ViewControllerFFTWindowSize, sampleRate: Float(microphone.audioStreamBasicDescription().mSampleRate), delegate: self)

    microphone.startFetchingAudio()


func microphone(microphone: EZMicrophone!, hasAudioReceived buffer: UnsafeMutablePointer<UnsafeMutablePointer<Float>>, withBufferSize bufferSize: UInt32, withNumberOfChannels numberOfChannels: UInt32) 

    fft.computeFFTWithBuffer(buffer[0], withBufferSize: bufferSize)



func fft(fft: EZAudioFFT!, updatedWithFFTData fftData: UnsafeMutablePointer<Float>, bufferSize: vDSP_Length) 
    var maxF = fft.fftData

    print(maxF)

    var data = fft.fftData
    print(data)

    //here coming my algorithm






使用此代码,它会在控制台上给出奇怪的输出:

var data = fft.fftData
print(data)

输出:0x00000001119be000

非常感谢您的帮助

【问题讨论】:

您不是在寻找fft.maxFrequency 而不是fft.fftData吗? 不,我不仅要寻找最大频率。我想寻找具有高能量的多个频率。你能帮帮我吗? 我的问题只是,我如何获取 fft 数据而不是如何分析。 文档说是 (cocoadocs.org/docsets/EZAudio/1.1.2/Classes/EZAudioFFT.html#//…),但是当我将其打印到控制台时,输出 0x00000001119be000。我不明白如何获取浮点数组数据。你有什么想法吗? 【参考方案1】:

fftData 是一个UnsafeMutablePointer,它是 C 指针的 Swift 等价物。指针是内存地址,而不是实际值(因此得名:它指向内存,但不是内存本身)。

因此,当您打印它时,您会得到一个地址 (0x00000001119be000)。如果要读取该地址处内存的实际值,则必须查找它。例如,要查看索引 0 处的值(在本例中为 Float),您可以...

print(fftData[0])

要查看所有值,只需循环并单独打印它们...

for (var i = 0; i < bufferSize; i++) 
   print(fftData[i])

UnsafeMutablePointer 还有一个属性叫memory...

print(fftData.memory)

但它只会返回该确切内存地址的值,而不是您感兴趣的值范围,使其等于fftData[0]

【讨论】:

以上是关于如何使用 EZAudio 在 Swift 中获取 FFT 数据?的主要内容,如果未能解决你的问题,请参考以下文章

EZAudio 中的音频输入源

EZAudio CocoaPods 模块导入错误

EZAudio 停止获取音频

EZAudio - 如何使用 EZAudioPlotGL 根据视图大小更改相同的波形大小

EZAudio:如何将缓冲区大小与 FFT 窗口大小分开(希望更高的频率 bin 分辨率)。

iOS 使用EZAudio库生成wav出错的情况