前提・実現したいこと
私は学校の課題でwavファイルを読み取りフーリエ変換して値を表示させたいと考えていますがどの数値を
使ってフーリエ変換したら良いのかがわかりません。
知っている方がいたら是非教えて欲しいです。
該当のソースコード
import UIKit import Accelerate import AVFoundation //分析された音声ファイルのリンク let path = Bundle.main.path(forResource: "bb", ofType: "wav")! //AVaudioFileコアでオーディオを起動 let url = NSURL.fileURL(withPath: path) let audioFile = try! AVAudioFile(forReading: url) //let frameCount = UInt32(audioFile.length) let perCount: Int = 2 let totalSampleFrames = Int(audioFile.length) //オーディオデータ var samples = [Float](repeating:0.0, count: Int(totalSampleFrames)) for _ in 0 ..< totalSampleFrames { let buffer = AVAudioPCMBuffer(pcmFormat: audioFile.processingFormat, frameCapacity: AVAudioFrameCount(totalSampleFrames)) try audioFile.read(into: buffer!, frameCount: AVAudioFrameCount(perCount)) } //サウンド情報とフレームの数でバッファを埋めます let log2n = UInt(round(log2(Double(totalSampleFrames)))) let bufferSizePOT = Int(1 << log2n) let fftSetup = vDSP_create_fftsetup(log2n, FFTRadix(FFT_RADIX2)) print("valeur du fftSetup (fftSetup!)") var realp = [Float](repeating: 0.0, count: bufferSizePOT/2) var imagp = [Float](repeating: 0.0, count: bufferSizePOT/2) var output = DSPSplitComplex(realp: &realp, imagp: &imagp) var samplesPtr = UnsafeRawPointer(samples).bindMemory(to: DSPComplex.self, capacity: bufferSizePOT) vDSP_ctoz(samplesPtr, 2, &output, 1, vDSP_Length(bufferSizePOT/2)) //output??? vDSP_fft_zrip(fftSetup!, &output, 1, log2n, Int32(FFTDirection(FFT_FORWARD))) // splitComplex.realp, splitComplex.imagpの各要素を1/2倍する var scale:Float = 1 / 2 vDSP_vsmul(output.realp, 1, &scale, output.realp, 1, vDSP_Length(bufferSizePOT/2)) vDSP_vsmul(output.imagp, 1, &scale, output.imagp, 1, vDSP_Length(bufferSizePOT/2)) // 複素数の実部と虚部を取得する let r = Array(UnsafeBufferPointer(start: output.realp, count: bufferSizePOT/2)) let i = Array(UnsafeBufferPointer(start: output.imagp, count: bufferSizePOT/2)) for n in 1..<bufferSizePOT/2 { let rel = r[n] let img = i[n] let mag = sqrtf(rel * rel + img * img) let log = "[%02d]: Mag: %5.2f, Rel: %5.2f, Img: %5.2f" print(String(format: log, n, mag, rel, img)) } vDSP_destroy_fftsetup(fftSetup)
試したこと
どのwavファイルの値をフーリエ変換の関数に与えればいいかがわかりません。
wavファイル自体の長さなどは読み取ることは出来ました。
補足情報(FW/ツールのバージョンなど)
Swift5
Xcode11を使用しています
あなたの回答
tips
プレビュー