                 var magnitudes = [Float](repeating: 0.0, count: inputCount)
                 vDSP_zvmags(&output, 1, &magnitudes, 1, vDSP_Length(inputCount))
 
-                // Normalising
-                var normalizedMagnitudes = [Float](repeating: 0.0, count: inputCount)
-                vDSP_vsmul(&magnitudes,
-                           1,
-                           [1.0 / (magnitudes.max() ?? 1.0)],
-                           &normalizedMagnitudes,
-                           1,
-                           vDSP_Length(inputCount))
+                if isNormalized {
+                    // Normalising
+                    var normalizedMagnitudes = [Float](repeating: 0.0, count: inputCount)
+                    vDSP_vsmul(&magnitudes,
+                               1,
+                               [1.0 / (magnitudes.max() ?? 1.0)],
+                               &normalizedMagnitudes,
+                               1,
+                               vDSP_Length(inputCount))
 
+                    vDSP_destroy_fftsetup(fftSetup)
+                    return normalizedMagnitudes
+                }
                 vDSP_destroy_fftsetup(fftSetup)
-                return normalizedMagnitudes
+                return magnitudes
             }
         }
     }

    override internal func doHandleTapBlock(buffer: AVAudioPCMBuffer, at time: AVAudioTime) {
        guard buffer.floatChannelData != nil else { return }

        fftData = FFTTap.performFFT(buffer: buffer)
        handler(fftData)
    }

    static func performFFT(buffer: AVAudioPCMBuffer) -> [Float] {
        let frameCount = buffer.frameLength
        let log2n = UInt(round(log2(Double(frameCount))))
        let bufferSizePOT = Int(1 << log2n)

    open var fftData: [Float]
    /// Type of callback
    public typealias Handler = ([Float]) -> Void
    /// Determines if the returned FFT data is normalized
    public var isNormalized: Bool = true

    private var handler: Handler = { _ in }

