summaryrefslogtreecommitdiffstats
path: root/noatun/modules/winskin/vis/realFFTFilter.cpp
blob: 13343bcedda932b9c6aa34160635a7f7e94f74ff (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
/*
  a FFT filter
  Copyright (C) 1998  Martin Vogt;Philip VanBaren, 2 September 1993

  This program 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.

  For more information look at the file COPYRIGHT in this package

 */


#include "realFFTFilter.h"

RealFFTFilter::RealFFTFilter(int fftPoints) {
  this->fftPoints = fftPoints;
  data=new short[fftPoints*4];  
  realFFT= new RealFFT(fftPoints*2);
}


RealFFTFilter::~RealFFTFilter() {
  delete data;
  delete realFFT;
}


int RealFFTFilter::getPoints() {
  return fftPoints;
}


short* RealFFTFilter::getPointPtr() {
  return data;
}


/*
  the array is expected to be a PCM stream (real data)
*/
int RealFFTFilter::fft16(float* left,float* right,int len) {
  int i;

  len=len/4;


  int mixTmp;

  // take care for no array overflows:
  int n=min(len,fftPoints);

  // copy things into fftArray.

  for (i = 0 ; i < n; i++) {
    mixTmp=(int) (16384.0*(left[i]+right[i]));

    if (mixTmp < SHRT_MIN) {
      data[i]= SHRT_MIN; 
    } else {
      if (mixTmp > SHRT_MAX) {
	data[i] = SHRT_MAX; 
      } else {
	data[i]=(short)mixTmp;
      }
    }
  }

  realFFT->fft(data);
  return true;
}



int* RealFFTFilter::getBitReversed() { 
  return realFFT->getBitReversed();
}



int RealFFTFilter::min(int x1,int x2) { 
  if (x1 < x2) {
    return x1;
  }
  return x2;
}