如何使用 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 - 如何使用 EZAudioPlotGL 根据视图大小更改相同的波形大小