我正在使用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
非常感谢您的帮助
最佳答案
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]
关于ios - 如何使用EZAudio在Swift中获取FFT数据?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33076115/