view src/spectrum_analyzer.hpp @ 0:add35537fdbb tip

Initial import
author irh <ian.r.hobson@gmail.com>
date Thu, 25 Aug 2011 11:05:55 +0100
parents
children
line wrap: on
line source
//  Copyright 2011, Ian Hobson.
//
//  This file is part of gpsynth.
//
//  gpsynth is free software: you can redistribute it and/or modify
//  it under the terms of the GNU General Public License as published by
//  the Free Software Foundation, either version 3 of the License, or
//  (at your option) any later version.
//
//  gpsynth is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//  GNU General Public License for more details.
//
//  You should have received a copy of the GNU General Public License
//  along with gpsynth in the file COPYING. 
//  If not, see http://www.gnu.org/licenses/.

// Wrapper classes for FFTW

#pragma once

#include "fftw3.h"

#include <complex>

namespace dsp {

// Float version
class SpectrumAnalyzerFloat {
  fftwf_plan plan_;
  int frame_size_;
  float* input_;
  std::complex<float>* output_;

public:
  SpectrumAnalyzerFloat(int frame_size = 1024)
  : frame_size_(frame_size)
  {
    input_ = (float*)fftw_malloc(sizeof(float) * frame_size);
    int buffer_size = sizeof(std::complex<float>) * frame_size / 2;
    output_ = (std::complex<float>*)fftw_malloc(buffer_size);
    plan_ = fftwf_plan_dft_r2c_1d(frame_size,
                                  input_,
                                  reinterpret_cast<fftwf_complex*>(output_),
                                  FFTW_ESTIMATE);
  }
  
  SpectrumAnalyzerFloat() {
    fftw_free(input_);
    fftw_free(output_);
    fftwf_destroy_plan(plan_);
  }
  
  void Execute() {
    fftwf_execute(plan_);
  }
  
  int Size() { return frame_size_; }
  float* Input() { return input_; }
  std::complex<float>* Output() { return output_; }
};
  
// Double version
class SpectrumAnalyzer {
  fftw_plan plan_;
  int frame_size_;
  double* input_;
  std::complex<double>* output_;
  
public:
  SpectrumAnalyzer(int frame_size = 1024)
  : frame_size_(frame_size)
  {
    input_ = (double*)fftw_malloc(sizeof(double) * frame_size);
    int buffer_size = sizeof(std::complex<double>) * frame_size;
    output_ = (std::complex<double>*)fftw_malloc(buffer_size);
    plan_ = fftw_plan_dft_r2c_1d(frame_size,
                                 input_,
                                 reinterpret_cast<fftw_complex*>(output_),
                                 FFTW_ESTIMATE);
  }
  
  SpectrumAnalyzer() {
    fftw_free(input_);
    fftw_free(output_);
    fftw_destroy_plan(plan_);
  }
  
  void Execute() {
    fftw_execute(plan_);
  }
  
  int Size() { return frame_size_; }
  double* Input() { return input_; }
  std::complex<double>* Output() { return output_; }
};

} // dsp namespace