Advertisement
Guest User

Untitled

a guest
Dec 4th, 2016
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.29 KB | None | 0 0
  1. // recupere le lien du fichier audio a analysé
  2. let url = getDocumentsDirectory().appendingPathComponent("recording.m4a")
  3. // lancé l'audio dans le core AVaudioFile
  4. let audioFile = try! AVAudioFile(forReading: url)
  5.  
  6. // nombre de frame dans l'audio
  7. let frameCount = UInt32(audioFile.length)
  8.  
  9. print("frame count(frameCount)")
  10. //remplis un buffer avec les information du son et le nombre de framme
  11. let buffer = AVAudioPCMBuffer(pcmFormat: audioFile.processingFormat, frameCapacity: frameCount)
  12. do {
  13. //lecture de l'audio dans le buffer
  14. try audioFile.read(into: buffer, frameCount:frameCount)
  15. print("lecture ok")
  16. } catch {
  17. //lecture échouer
  18.  
  19. }
  20.  
  21. print(buffer.floatChannelData?.pointee ?? "aucune valeur float")
  22.  
  23. // printer le buffer de byte de l'audio
  24. print("n buffer: n");
  25. for k in 1...frameCount
  26. {
  27. print("value buffer (buffer.floatChannelData?.pointee[Int(k)])");
  28. }
  29.  
  30.  
  31. // définit un fonction log2n
  32. let log2n = UInt(round(log2(Double(frameCount))))
  33.  
  34. // définit la taille de buffer final potentiel
  35. let bufferSizePOT = Int(1 << log2n)
  36.  
  37. //crée une structure FFT
  38. //Si zéro est renvoyé, la routine n'a pas réussi à allouer de stockage
  39. let fftSetup = vDSP_create_fftsetup(log2n, Int32(kFFTRadix2))
  40.  
  41. //print fft
  42. print("valeur du fftSetup (fftSetup)")
  43.  
  44.  
  45. // create packed real input
  46. // séparation des buffer en nombre réel et imaginaire :
  47.  
  48. var realp = [Float](repeating: 0.0, count: bufferSizePOT/2)
  49. var imagp = [Float](repeating: 0.0, count: bufferSizePOT/2)
  50.  
  51. /*
  52. print("n real and image: n");
  53. for k in 0..<realp.count
  54. {
  55. print("value real (realp[k]) et value imaginaire (imagp[k])");
  56. }
  57. */
  58.  
  59. // construit un vecteur double contenant les real et les imaginaire
  60. var output = DSPSplitComplex(realp: &realp, imagp: &imagp)
  61.  
  62. buffer.floatChannelData?.withMemoryRebound(to: DSPComplex.self, capacity: bufferSizePOT/2) {
  63. /*
  64. Copie le contenu d'un vecteur complexe intercalé C vers un vecteur complexe divisé Z; Précision unique.
  65.  
  66. void vDSP_ctoz(const DSPComplex *__C, vDSP_Stride __IC, const DSPSplitComplex *__Z, vDSP_Stride __IZ, vDSP_Length __N);
  67. Paramètres
  68. __C
  69. Vecteur d'entrée complexe entrelacé à simple précision.
  70. __IC
  71. Stride pour C; Doit être un nombre pair.
  72. __Z
  73. Vecteur de sortie complexe à division simple.
  74. za
  75. Stride pour Z.
  76. __N
  77. Le nombre d'éléments à traiter.
  78.  
  79. */
  80. dspComplexStream in vDSP_ctoz(dspComplexStream, 2, &output, 1, UInt(bufferSizePOT / 2))
  81. }
  82.  
  83. /*
  84. calcul la série de fourier discrette du domaine temporel ver le domaine fréquentielle
  85. paramètre :
  86.  
  87. func vDSP_fft_zrip(_ __Setup:
  88. - --FFTSetup: l'objet FFTsetup
  89. _ __C: pointeur sur le vecteur complex de sortie
  90. _ __IC: pas entre les elements de --C, (a 1 pour des meilleures performance)
  91. _ __Log2N: Il base 2 exposant du nombre d'éléments à traiter. Par exemple, pour traiter 1024 éléments,
  92. spécifiez 10 pour le paramètre Log2N.
  93. _ __Direction: FFTDirection : donne la direction de la discretisations.
  94. time domain to the frequency domain = (forward).
  95. frequency domain to the time domain (inverse).
  96. )*/
  97. vDSP_fft_zrip(fftSetup!, &output, 1, log2n, Int32(FFTDirection(FFT_FORWARD)))
  98.  
  99.  
  100. print("nSpectrum:n");
  101. for i in 0..<realp.count
  102. {
  103. print("value de i (i), réel : (output.realp[i]), imaginaire : (imagp[i])");
  104. }
  105.  
  106. var fft = [Float](repeating:0.0, count:Int(bufferSizePOT / 2))
  107. let bufferOver2: vDSP_Length = vDSP_Length(bufferSizePOT / 2)
  108.  
  109. vDSP_zvmags(&output, 1, &fft, 1, bufferOver2)
  110. for i in 0..<bufferSizePOT/2
  111. {
  112. print("value de buff2 (fft[i])");
  113. }
  114. // termine le processus FFT
  115. vDSP_destroy_fftsetup(fftSetup)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement