Пример #1
0
void fft_filt_c::pre_run() {
 if (filter_is_set) {
  prepare_filter();
  if (!fft_ready && filter_is_ready) {
   if (is_complex) {
    fft_fcfg_c    = kiss_fft_alloc(fft_len,0,0,0);
    fft_icfg_c    = kiss_fft_alloc(fft_len,1,0,0);
    input_buf_c   = new kiss_fft_cpx[fft_len];
    fdom_buf      = new kiss_fft_cpx[fft_len];
    fdom_conv_buf = new kiss_fft_cpx[fft_len];
    output_buf_c  = new kiss_fft_cpx[fft_len];
    last_output_buf_c = new kiss_fft_cpx[fft_len-l];
    memset(last_output_buf_c,0,sizeof(kiss_fft_cpx)*(fft_len-l));
   } else {
    fft_fcfg_r    = kiss_fftr_alloc(fft_len,0,0,0);
    fft_icfg_r    = kiss_fftr_alloc(fft_len,1,0,0);
    input_buf_r   = new kiss_fft_scalar[fft_len];
    fdom_buf      = new kiss_fft_cpx[fft_len/2+1];
    fdom_conv_buf = new kiss_fft_cpx[fft_len/2+1];
    output_buf_r  = new kiss_fft_scalar[fft_len];
    last_output_buf_r = new kiss_fft_scalar[fft_len-l];
    memset(last_output_buf_r,0,sizeof(kiss_fft_scalar)*(fft_len-l));
   }
   fft_ready = true;
  }
 }
};
Пример #2
0
FFT::FFT(int nsamples_){
	nsamples=nsamples_;
	if (nsamples%2!=0) {
		nsamples+=1;
		printf("WARNING: Odd sample size on FFT::FFT() (%d)",nsamples);
	};
	smp=new REALTYPE[nsamples];for (int i=0;i<nsamples;i++) smp[i]=0.0;
	freq=new REALTYPE[nsamples/2+1];for (int i=0;i<nsamples/2+1;i++) freq[i]=0.0;
	window.data=new REALTYPE[nsamples];for (int i=0;i<nsamples;i++) window.data[i]=0.707;
	window.type=W_RECTANGULAR;

#ifdef KISSFFT
	datar=new kiss_fft_scalar[nsamples+2];
	for (int i=0;i<nsamples+2;i++) datar[i]=0.0;
	datac=new kiss_fft_cpx[nsamples/2+2];
	for (int i=0;i<nsamples/2+2;i++) datac[i].r=datac[i].i=0.0;
	plankfft = kiss_fftr_alloc(nsamples,0,0,0);
	plankifft = kiss_fftr_alloc(nsamples,1,0,0);
#else
	data=new REALTYPE[nsamples];for (int i=0;i<nsamples;i++) data[i]=0.0;
	planfftw=fftwf_plan_r2r_1d(nsamples,data,data,FFTW_R2HC,FFTW_ESTIMATE);
	planifftw=fftwf_plan_r2r_1d(nsamples,data,data,FFTW_HC2R,FFTW_ESTIMATE);
#endif
	rand_seed=start_rand_seed;
	start_rand_seed+=161103;
};
Пример #3
0
void FftConvolver::setResponse(int length, float* newResponse) {
	int neededLength= kiss_fftr_next_fast_size_real	(block_size+length);
	int newTailSize=neededLength-block_size;
	if(neededLength !=fft_size || tail_size !=newTailSize) {
		if(workspace) freeArray(workspace);
		workspace=allocArray<float>(neededLength);
		if(tail) freeArray(tail);
		tail=allocArray<float>(newTailSize);
		fft_size=neededLength/2+1;
		workspace_size=neededLength;
		tail_size=newTailSize;
		if(fft) kiss_fftr_free(fft);
		fft = kiss_fftr_alloc(workspace_size, 0, nullptr, nullptr);
		if(ifft) kiss_fftr_free(ifft);
		ifft=kiss_fftr_alloc(workspace_size, 1, nullptr, nullptr);
		if(response_fft) freeArray(response_fft);
		response_fft=allocArray<kiss_fft_cpx>(fft_size);
		if(block_fft) freeArray(block_fft);
		block_fft=allocArray<kiss_fft_cpx>(fft_size);
	}
	memset(workspace, 0, sizeof(float)*workspace_size);
	memset(tail, 0, sizeof(float)*tail_size);
	//Store the fft of the response.
	std::copy(newResponse, newResponse+length, workspace);
	kiss_fftr(fft, workspace, response_fft);
}
Пример #4
0
int fft2_init(bool cmplx1        /* if complex transform */,
              int pad1           /* padding on the first axis */,
              int nx,   int ny   /* input data size */,
              int *nx2, int *ny2 /* padded data size */)
/*< initialize >*/
{
#ifndef SF_HAS_FFTW
    int i2;
#endif

    cmplx = cmplx1;

    if (cmplx) {
        nk = n1 = kiss_fft_next_fast_size(nx*pad1);

#ifndef SF_HAS_FFTW
        cfg1  = kiss_fft_alloc(n1,0,NULL,NULL);
        icfg1 = kiss_fft_alloc(n1,1,NULL,NULL);
#endif
    } else {
        nk = kiss_fft_next_fast_size(pad1*(nx+1)/2)+1;
        n1 = 2*(nk-1);

#ifndef SF_HAS_FFTW
        cfg  = kiss_fftr_alloc(n1,0,NULL,NULL);
        icfg = kiss_fftr_alloc(n1,1,NULL,NULL);
#endif
    }

    n2 = kiss_fft_next_fast_size(ny);

    if (cmplx) {
        cc = sf_complexalloc2(n1,n2);
    } else {
        ff = sf_floatalloc2(n1,n2);
    }

#ifndef SF_HAS_FFTW
    cfg2  = kiss_fft_alloc(n2,0,NULL,NULL);
    icfg2 = kiss_fft_alloc(n2,1,NULL,NULL);

    tmp =    (kiss_fft_cpx **) sf_alloc(n2,sizeof(*tmp));
    tmp[0] = (kiss_fft_cpx *)  sf_alloc(nk*n2,sizeof(kiss_fft_cpx));
    for (i2=0; i2 < n2; i2++) {
        tmp[i2] = tmp[0]+i2*nk;
    }

    trace2 = sf_complexalloc(n2);
    ctrace2 = (kiss_fft_cpx *) trace2;
#endif

    *nx2 = n1;
    *ny2 = n2;

    wt =  1.0/(n1*n2);

    return (nk*n2);
}
Пример #5
0
ADRess::ADRess(double sampleRate, int blockSize, int beta):sampleRate_(sampleRate),BLOCK_SIZE(blockSize),BETA(beta)
{
    currStatus_ = kBypass;
    d_ = BETA/2;
    H_ = BETA/4;
    LR_ = 2;
    currFilter_ = kAllPass;
    cutOffFrequency_ = 0.0;
    cutOffBinIndex_ = 0;
    
    // Hann window
    windowBuffer_ = new float[BLOCK_SIZE];
    for (int i = 0; i < BLOCK_SIZE; i++)
        windowBuffer_[i] = 0.5*(1.0 - cos(2.0*M_PI*(float)i/(BLOCK_SIZE-1)) );
    
    // all pass frequency mask
    frequencyMask_ = new float[BLOCK_SIZE/2+1];
    for (int i = 0; i < BLOCK_SIZE/2+1; i++)
        frequencyMask_[i] = 1.0;
    
    // initialise FFt
    fwd_= kiss_fftr_alloc(BLOCK_SIZE,0,NULL,NULL);
    inv_= kiss_fftr_alloc(BLOCK_SIZE,1,NULL,NULL);
    
    leftSpectrum_ = new complex<float>[BLOCK_SIZE];
    rightSpectrum_ = new complex<float>[BLOCK_SIZE];
    
    leftMag_ = new float[BLOCK_SIZE/2+1];
    rightMag_ = new float[BLOCK_SIZE/2+1];
    leftPhase_ = new float[BLOCK_SIZE/2+1];
    rightPhase_ = new float[BLOCK_SIZE/2+1];
    
    resynMagL_ = new float[BLOCK_SIZE/2+1];
    for (int i = 0; i<=BLOCK_SIZE/2; i++)
        resynMagL_[i] = 0;
    
    resynMagR_ = new float[BLOCK_SIZE/2+1];
    for (int i = 0; i<=BLOCK_SIZE/2; i++)
        resynMagR_[i] = 0;
    
    minIndicesL_ = new int[BLOCK_SIZE/2+1];
    minValuesL_ = new float[BLOCK_SIZE/2+1];
    maxValuesL_ = new float[BLOCK_SIZE/2+1];
    
    minIndicesR_ = new int[BLOCK_SIZE/2+1];
    minValuesR_ = new float[BLOCK_SIZE/2+1];
    maxValuesR_ = new float[BLOCK_SIZE/2+1];
    
    azimuthL_ = new float*[BLOCK_SIZE/2+1];
    for (int n = 0; n<BLOCK_SIZE/2+1; n++)
        azimuthL_[n] = new float[BETA+1];
    
    azimuthR_ = new float*[BLOCK_SIZE/2+1];
    for (int n = 0; n<BLOCK_SIZE/2+1; n++)
        azimuthR_[n] = new float[BETA+1];
    
}
Пример #6
0
SjOscSpectrum::SjOscSpectrum(long sampleCount)
{
	m_sampleCount       = sampleCount;
	m_kiss_fft_setup    = kiss_fftr_alloc(SPEC_NUM*2, 0, NULL, 0);
	m_chData[0].chNum   = 0;
	m_chData[1].chNum   = 1;

	m_crazyState = CRAZY_NONE;
	m_firstCrazy = FALSE;

	// calculate the frequency band -> box array
	static const unsigned int analyzer[20]= {1,3,5,7,9,13,19,25,38,58,78,116,156,195,235,274,313,352,391,430};
	int b;
	for( b = 0; b < NUM_BOXES; b++ )
	{
		int from = b?             analyzer[b-1]+(analyzer[b]  -analyzer[b-1])/2 : 0;
		int to   = b<NUM_BOXES-1? analyzer[b]  +(analyzer[b+1]-analyzer[b]  )/2 : SPEC_NUM;

		int j;
		for( j = from; j < to; j++ )
		{
			m_freqToBox[j] = b;
		}

		m_boxSampleCount[b] = to-from;
	}
}
Пример #7
0
FFTLib::FFTLib(size_t frame_size) : m_frame_size(frame_size) {
    m_window = (kiss_fft_scalar *) KISS_FFT_MALLOC(sizeof(kiss_fft_scalar) * frame_size);
    m_input = (kiss_fft_scalar *) KISS_FFT_MALLOC(sizeof(kiss_fft_scalar) * frame_size);
    m_output = (kiss_fft_cpx *) KISS_FFT_MALLOC(sizeof(kiss_fft_cpx) * frame_size);
    PrepareHammingWindow(m_window, m_window + frame_size, 1.0 / INT16_MAX);
    m_cfg = kiss_fftr_alloc(frame_size, 0, NULL, NULL);
}
Пример #8
0
void ConstQ::genSparseKernel()
{
  // get frequencies of min and max Note
  minFreq = noteNum2Freq((float)minNote);
  maxFreq = noteNum2Freq((float)maxNote);

  // get Q value and the number of total constant Q bins
  Q = 1./(pow(2.,(1./bpo)) - 1);
  constQBins = ceil(bpo * log2(maxFreq/minFreq));
  
  // memory alloc for sparkernel bins
  sparkernel = new sparKernel[constQBins];
  
  fftLength =
    nextPowerOf2((unsigned int) ceil(Q * fs/minFreq));

  // fft setup
  fft = kiss_fft_alloc(fftLength, 0, NULL, NULL);
  fftr = kiss_fftr_alloc(fftLength, 0, NULL, NULL);

  for (int k=constQBins; k > 0; k--){
    double centerFreq = (minFreq * pow(2,(float(k-1)/bpo)));

    int upperBound = ceil(centerFreq * pow(2,  1./12) * fftLength/fs);
    int lowerBound = floor(centerFreq * pow(2, -1./12) * fftLength/fs);

    sparkernel[k-1].s = lowerBound;
    sparkernel[k-1].e = upperBound;
    sparkernel[k-1].cpx = new kiss_fft_cpx[upperBound - lowerBound];
  }
  pthread_create(&thread, NULL, ConstQ::sparseKernelThread, this);

}
Пример #9
0
static
void fft_file_real(FILE * fin, FILE * fout, int nfft, int isinverse)
{
    kiss_fftr_cfg st;
    kiss_fft_scalar * rbuf;
    kiss_fft_cpx * cbuf;

    rbuf = (kiss_fft_scalar*)malloc(sizeof(kiss_fft_scalar) * nfft);
    cbuf = (kiss_fft_cpx*)malloc(sizeof(kiss_fft_cpx) * (nfft / 2 + 1));
    st = kiss_fftr_alloc(nfft , isinverse , 0, 0);

    if (isinverse == 0) {
        while (fread(rbuf , sizeof(kiss_fft_scalar) * nfft , 1, fin) > 0) {
            kiss_fftr(st , rbuf , cbuf);
            fwrite(cbuf , sizeof(kiss_fft_cpx) , (nfft / 2 + 1) , fout);
        }
    } else {
        while (fread(cbuf , sizeof(kiss_fft_cpx) * (nfft / 2 + 1) , 1, fin) > 0) {
            kiss_fftri(st , cbuf , rbuf);
            fwrite(rbuf , sizeof(kiss_fft_scalar) , nfft , fout);
        }
    }
    free(st);
    free(rbuf);
    free(cbuf);
}
Пример #10
0
JNIEXPORT jlong JNICALL Java_com_badlogic_gdx_audio_analysis_KissFFT_create  (JNIEnv *, jobject, jint numSamples)
{
	KissFFT* fft = new KissFFT();
	fft->config = kiss_fftr_alloc(numSamples,0,NULL,NULL);
	fft->spectrum = (kiss_fft_cpx*)malloc(sizeof(kiss_fft_cpx) * numSamples);
	fft->numSamples = numSamples;
	return (jlong)fft;
	return 0;
}
Пример #11
0
JNIEXPORT jlong JNICALL Java_de_jurihock_voicesmith_dsp_KissFFT_alloc(JNIEnv *,
		jobject, jint size)
{
	KissFFT* fft = new KissFFT();

	fft->size = size;

	fft->forward = kiss_fftr_alloc(size, 0, NULL, NULL);
	fft->backward = kiss_fftr_alloc(size, 1, NULL, NULL);

	// The spectrum buffer contains N/2+1 float tuples (Re,Im)
	fft->spectrum = (kiss_fft_cpx*) malloc(
			sizeof(kiss_fft_cpx) * ((size / 2) + 1));

	fft->halfBuffer = (float*) malloc(sizeof(float) * (size / 2));

	return (jlong) fft;
}
// ----------------------------------------------------------------------------
void ofOpenALSoundPlayer::initSystemFFT(int bands){
	if(int(systemBins.size())==bands) return;
	int signalSize = (bands-1)*2;
	if(systemFftCfg!=0) kiss_fftr_free(systemFftCfg);
	systemFftCfg = kiss_fftr_alloc(signalSize, 0, NULL, NULL);
	systemCx_out.resize(bands);
	systemBins.resize(bands);
	createWindow(signalSize);
}
// ----------------------------------------------------------------------------
void ofOpenALSoundPlayer_TimelineAdditions::initFFT(int bands){
	if(int(bins.size())==bands) return;
	int signalSize = (bands-1)*2;
	if(fftCfg!=0) kiss_fftr_free(fftCfg);
	fftCfg = kiss_fftr_alloc(signalSize, 0, NULL, NULL);
	cx_out.resize(bands);
	bins.resize(bands);
	createWindow(signalSize);
}
Пример #14
0
void velcon_init(int nt1   /* time samples */,
		 int nx1   /* space samples */,
		 float dt1 /* time sampling */,
		 float dx1 /* space sampling */,
		 float t1  /* time origin */,
		 int pad1, 
		 int pad2  /* padding in time */,
		 int next /* trace extension */)
/*< initialize >*/
{
    nt = nt1;
    nx = nx1;
    dt = dt1;
    dx = dx1;
    t0 = t1;

    n2 = pad1;
    n3 = pad2;

    /* t squared stretch */
    o2 = t0*t0;
    d2 = t0+(nt-1)*dt;
    d2 = (d2*d2 - o2)/(n2-1);

    str = fint1_init(next,nt,0);
    istr = fint1_init(next,n2,0);

    /* FFT in time */
    forw = kiss_fftr_alloc(n3,0,NULL,NULL);
    invs = kiss_fftr_alloc(n3,1,NULL,NULL);
    if (NULL == forw || NULL == invs) 
	sf_error("KISS FFT allocation error");

    nw = n3/2+1;
    dw = 2*SF_PI/(n3*d2);

    /* cosine FT in space */
    sf_cosft_init(nx);
    dx = SF_PI/(kiss_fft_next_fast_size(nx-1)*dx1);

    strace = sf_floatalloc(n3);
    ctrace = sf_complexalloc(nw);
}
Пример #15
0
void FFTinit() {
    /**************************************************************************/
       // initialize audio frequency analysis arrays
/**************************************************************************/
    fft_cfg = kiss_fftr_alloc(FFT_SIZE, FALSE, NULL, NULL);
    fft_in = (kiss_fft_scalar*)malloc(FFT_SIZE * sizeof(kiss_fft_scalar));
    fft_out = (kiss_fft_cpx*)malloc(FFT_SIZE / 2 * sizeof(kiss_fft_cpx) + 1);
/**************************************************************************/
    
}
Пример #16
0
void sf_cosft_init(int n1_in)
/*< initialize >*/ 
{
    n1 = n1_in;
    nt = 2*kiss_fft_next_fast_size(n1-1);
    nw = nt/2+1;
    p  = sf_floatalloc (nt);
    pp = (kiss_fft_cpx*) sf_complexalloc(nw);

#ifdef SF_HAS_FFTW
    cfg = fftwf_plan_dft_r2c_1d(nt, p, (fftwf_complex *) pp,
				FFTW_ESTIMATE);
    icfg = fftwf_plan_dft_c2r_1d(nt, (fftwf_complex *) pp, p,
				 FFTW_ESTIMATE);
#else
    forw = kiss_fftr_alloc(nt,0,NULL,NULL);
    invs = kiss_fftr_alloc(nt,1,NULL,NULL);
#endif
}
Пример #17
0
void fft1_2D_fwd (float *input, float *output, int n2)
/*< Fast Fourier Transform along the first axis forward>*/
{
    /*bool inv, sym, opt;*/
    int n1, i1, i2;
    float  *p,  wt, shift;
    kiss_fft_cpx *pp, ce;
    char *label;
    sf_file out=NULL;
    kiss_fftr_cfg cfg;
	bool verb;

	verb=1;

    
    
  wt = sym? 1./sqrtf((float) ntopt): 1.0/ntopt;

  p = sf_floatalloc(ntopt);
  pp = (kiss_fft_cpx*) sf_complexalloc(nw);

  cfg = kiss_fftr_alloc(ntopt,0,NULL,NULL);
    

	for (i2=0; i2 < n2; i2++) {

    /*sf_floatread (p,n1,in);*/
    memcpy(p,&input[i2*nt],nt*sizeof(float));
    if (sym) {
      for (i1=0; i1 < nt; i1++) {
    	  p[i1] *= wt;
      }
    }
    for (i1=nt; i1 < ntopt; i1++) {
      p[i1]=0.0; // padding
    }
    
      kiss_fftr (cfg,p,pp);
    
    if (0. != ot) {
      for (i1=0; i1 < nw; i1++) {
          shift = -2.0*SF_PI*i1*dw*ot;
          ce.r = cosf(shift);
          ce.i = sinf(shift);
          pp[i1]=sf_cmul(pp[i1],ce);
      }
    }
    
    memcpy(&output[i2*2*nw],pp,2*nw*sizeof(float));
  }
    free(p);
    free(pp);

	/*exit (0);*/
}
Пример #18
0
IFFT::IFFT (ssi_size_t rfft_, ssi_size_t dim_) 
: rfft (rfft_), nfft ((rfft_ - 1) << 1), dim (dim_) {

	_icfg = kiss_fftr_alloc (nfft,1,0,0);
	_data = new ssi_real_t *[dim];
	_fdata = new kiss_fft_cpx *[dim];
	for (ssi_size_t i = 0; i < dim; i++) {
		_data[i] = new ssi_real_t[nfft];
		_fdata[i] = new kiss_fft_cpx[rfft];
	}
}
Пример #19
0
int main(int argc, char *argv[])
{
	const char *filename_wav, *filename_png;
	kiss_fftr_cfg fft;
	int err = 0;

	for (;;) {

		const int c = getopt(argc, argv, "h");
		if (0 > c)
			break;

		switch (c) {

		case '?':
			err = EINVAL;
			/*@fallthrough@*/
		case 'h':
			usage();
			return err;
		}
	}

	if (argc < 3 || argc != (optind + 2)) {
		usage();
		return -EINVAL;
	}

	filename_wav = argv[optind++];
	filename_png = argv[optind++];

	fft = kiss_fftr_alloc(NUM_FFT, 0, 0, 0);
	if (!fft) {
		err = ENOMEM;
		goto out;
	}

	err = read_wav(fft, filename_wav);
	if (err)
		goto out;
 
	err = plot_spectrum(filename_png);
	if (err)
		goto out;

 out:
	if (fft)
		kiss_fftr_free(fft);

	tmr_debug();
	mem_debug();

	return err;
}
JNIEXPORT jlong JNICALL Java_euphony_lib_receiver_KissFFT_create (JNIEnv *, jobject, jint numSamples)
{
    KissFFT* fft = new KissFFT();

   fft->config = kiss_fftr_alloc(numSamples,0,NULL,NULL);
   fft->spectrum = (kiss_fft_cpx*)malloc(sizeof(kiss_fft_cpx) * (int)numSamples);

   //__android_log_print(ANDROID_LOG_INFO,"----","r: %f i : %f",fft->spectrum->r, fft->spectrum->i);
   fft->numSamples = numSamples;
    return (jlong)fft;
    return 0;
}
Пример #21
0
void freqfilt4pi_init(int n1, int n2 /* data dimensions */, 
		    int nw1        /* number of frequencies */)
/*< initialize >*/
{
    m1 = n1;
    nw = nw1;
    m2 = n2;
    nfft = 2*kiss_fft_next_fast_size((n1+1)/2);

    tfor = kiss_fftr_alloc(nfft,0,NULL,NULL);
    tinv = kiss_fftr_alloc(nfft,1,NULL,NULL);
    xfor = kiss_fft_alloc(n2,0,NULL,NULL);
    xinv = kiss_fft_alloc(n2,1,NULL,NULL);
    if (NULL == tfor || NULL == tinv || NULL == xfor || NULL == xinv)
	sf_error("%s: KISS FFT allocation error",__FILE__);

    trace = sf_floatalloc(nfft);
    ctrace = (kiss_fft_cpx*) sf_complexalloc(nw);
    ctrace2 = (kiss_fft_cpx*) sf_complexalloc(n2);
    fft = (kiss_fft_cpx**) sf_complexalloc2(nw,n2);
}
Пример #22
0
void radonoper_init (int nt_in, float dt_in, float t0_in,
		     int nx_in, float dx_in, float ox_in, float x0_in,
		     int np_in, float dp_in, float p0_in,
		     bool par_in)
/*< initialize >*/
{
    int ix;
    nx = nx_in;
    nt = nt_in;
    np = np_in;
    nt2 = 2*kiss_fft_next_fast_size(nt_in);
    nw  = nt2/2+1;
    dw  = 2.0*SF_PI/(nt2*dt_in);

    dd = sf_complexalloc(nx_in);
    mm = sf_complexalloc(np_in);  
    tt = sf_floatalloc (nt2);
    cm = sf_complexalloc2 (nw,np_in);
    cd = sf_complexalloc2 (nw,nx_in);   

    forw = kiss_fftr_alloc(nt2,0,NULL,NULL);
    invs = kiss_fftr_alloc(nt2,1,NULL,NULL);
    dd = sf_complexalloc(nx_in);
    mm = sf_complexalloc(np_in);   
    xx = sf_floatalloc(nx_in);

    for (ix=0; ix < nx_in; ix++) {
	xx[ix] = ox_in + ix*dx_in;
    }
    for (ix=0; ix < nx_in; ix++) {
	if (par_in) {
	    xx[ix] *= xx[ix]/(x0_in*x0_in); 
	} else if (1. != x0_in) {
	    xx[ix] /= x0_in;
	}
    }
 
    radon_init (nx_in, np_in, dp_in, p0_in); /* initiliaze radon operator */
    
}
Пример #23
0
powerspectrum::powerspectrum(
        const Eigen::VectorXf& win_funct,
        float hop)
{
    this->win_funct = win_funct;
    this->win_size = win_funct.size();
    this->hop_size = hop*win_size;

    // initialize kiss fft
    kiss_pcm = (kiss_fft_scalar*)malloc(sizeof(kiss_fft_scalar) * win_size);
    kiss_freq = (kiss_fft_cpx*)malloc(sizeof(kiss_fft_cpx) * (win_size/2 + 1));
    kiss_status = kiss_fftr_alloc(win_size, 0, NULL, NULL);
}
Пример #24
0
dm_fftSetup dm_fftSetupCreate(unsigned long size_, dm_fftDirection direction_) {
  fftsetup_internal* toReturn = new fftsetup_internal();
  toReturn->direction = direction_;
#ifdef DSP_USE_ACCELERATE
  toReturn->logFftSize = log2f(size_);
  toReturn->fftSetup = vDSP_create_fftsetup(toReturn->logFftSize, FFT_RADIX2);
#else
  toReturn->fftSize = size_;
  toReturn->fftSetup = kiss_fftr_alloc(size_, (toReturn->direction == DM_FFT_FORWARD) ? 0 : 1, 0, 0);
  toReturn->temp = new float[size_];
  memset(toReturn->temp, 0, sizeof(float) * size_);
#endif
  return toReturn;
}
Пример #25
0
FFT* NewIFFT( int numSamples )
{
	FFT* fft = (FFT*)malloc(sizeof(FFT));

    fft->direction = INVERSE;

	fft->config = kiss_fftr_alloc(numSamples, 1, NULL, NULL);
	fft->spectrum = NULL;
    fft->realSignal = (kiss_fft_scalar*)malloc(sizeof(kiss_fft_scalar)*numSamples);
	fft->numSamples = numSamples;
    fft->usescale = USESCALE_YES;
    fft->scale = 1.0f/numSamples;
	return fft;
}
Пример #26
0
Файл: fft.c Проект: matvii/ADAM
int main()
{
  //complex out[8];
  int size=8;
  kiss_fft_cpx fft_out[size];
  kiss_fftr_cfg cfg=kiss_fftr_alloc(size,0,0,0);
  double in[8]={0.1,-1.1,2.0,-4.1,3.1,2.0,-4.4,1.0};
  //kiss_fftr_cfg cfg = kiss_fftr_alloc( 8,0 ,0,0 );
kiss_fftr( cfg,in,fft_out);
	 printf("\n");
	 for(int j=0;j<8;j++)
	   printf("%f I%f\n",fft_out[j].r,fft_out[j].i);
	 printf("\n");
}
Пример #27
0
void AudioReader::start(char* llabel = "cloop:capture_1", char* rlabel = "cloop:capture_2") {
    if(running)
        return;
    running = true;
    // set up the history
    head = 0;
    history_length = 0;
    sounds = new Sound[max_history_length];
    if((client = jack_client_open("AudioReader", JackNoStartServer, NULL)) == 0){
        fprintf(stderr, "jack server not running?\n");
        exit(EXIT_FAILURE);
    }
    pthread_mutex_lock(&reading_mutex); // jack_client_open() links the process() callback and if process() runs before the ports are connected this will break
    jack_set_process_callback(client, audio_reader_process_callback, (void *) this);
    jack_on_shutdown(client, audio_reader_shutdown_callback, this);
    if (jack_activate(client)) {
        fprintf(stderr, "Cannot activate client");
        exit(EXIT_FAILURE);
    }
    // register the ports to capture data on, in this case set with the JACK audio GUI
    output_left = jack_port_by_name(client, llabel);
    output_right = jack_port_by_name(client, rlabel);
    if (output_left == NULL || output_right == NULL) {
        fprintf(stderr, "Can't get ports from Jack server");
        jack_client_close(client);
        exit(EXIT_FAILURE);
    }
    // allocate space for the main audio buffer that will continuously be written to
    buffer = new jack_default_audio_sample_t[nports * maxframes];
    // register this program's loopback ports
    input_left = jack_port_register(client, "AudioReaderLeft", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0);
    input_right = jack_port_register(client, "AudioReaderRight", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0);
    if (input_left == 0 || input_right == 0) {
        fprintf(stderr, "Cannot register loopback port\n");
        stop();
        exit(EXIT_FAILURE);
    }
    // create the new connections to route all audio to system out through this program
    int left_con = jack_connect(client, jack_port_name(output_left), jack_port_name(input_left));
    int right_con = jack_connect(client, jack_port_name(output_right), jack_port_name(input_right));
    if (left_con != 0 || right_con != 0) {
        fprintf(stderr, "Cannot connect input to output\n");
        stop();
        exit(EXIT_FAILURE);
    }
    pthread_mutex_unlock(&reading_mutex);
    // allocate the space for the fft
    if ((cfg = kiss_fftr_alloc(maxframes, 0, NULL, NULL)) == NULL)
        fprintf(stderr, "Out of memory!\n");
}
Пример #28
0
FFT* NewFFT( int numSamples )
{
	FFT* fft = (FFT*)malloc(sizeof(FFT));

    fft->direction = FORWARD;
    
	fft->config = kiss_fftr_alloc(numSamples, 0, NULL, NULL);
	fft->spectrum = (kiss_fft_cpx*) malloc(sizeof(kiss_fft_cpx) * numSamples);
    fft->realSignal = NULL;
	fft->numSamples = numSamples;
    fft->usescale = USESCALE_NO;
    fft->scale = 1;
	return fft;
}
Пример #29
0
int rp_spectr_fft_init()
{
    if(rp_kiss_fft_out1 || rp_kiss_fft_out2 || rp_kiss_fft_cfg) {
        rp_spectr_fft_clean();
    }

    rp_kiss_fft_out1 = 
        (kiss_fft_cpx *)malloc(SPECTR_FPGA_SIG_LEN * sizeof(kiss_fft_cpx));
    rp_kiss_fft_out2 =
        (kiss_fft_cpx *)malloc(SPECTR_FPGA_SIG_LEN * sizeof(kiss_fft_cpx));

    rp_kiss_fft_cfg = kiss_fftr_alloc(SPECTR_FPGA_SIG_LEN, 0, NULL, NULL);

    return 0;
}
Пример #30
0
void AudioLightifier::sample(uint32_t offset) {
  // starting from some offset, run an FFT on WINDOW_SIZE
  // samples (at 1024 on 44.1kHz, this'll be ~20ms of audio)

  short* pcm = reinterpret_cast<short*>(m_data->pcm);
  m_sampleIntensity = 0.f;

  // sample starting at offset
  for (int i = 0; i < WINDOW_SIZE; ++i) {
    fft_in[i] = pcm[offset / 2 + (m_data->stereo ? i * 2 : i)];
    m_sampleIntensity += fabs(fft_in[i]);
  }

  m_sampleIntensity /= WINDOW_SIZE;

  // run real fft (note that we get complex results)
  kiss_fftr_cfg fft_conf = kiss_fftr_alloc(WINDOW_SIZE, 0, 0, 0);
  kiss_fftr(fft_conf, fft_in, fft_out);

  kiss_fft_cpx* result = fft_out;
  ++result; // skip DC

  m_binAvg = 0.f;
  m_binStdDev = 0.f;
  m_bassIntensity = 0.f;
  int bassSamples = 0;

  // sample decibel magnitude into bins
  for (int i = 0; i < WINDOW_SIZE / 2; ++i) {
    m_bins[i] = log10(result->r * result->r + result->i * result->i);
    if (i * (44100.f / WINDOW_SIZE) > 32.f && i * (44100.f / WINDOW_SIZE) > 512.f) {
      m_bassIntensity += m_bins[i];
      ++bassSamples;
    }
    m_binAvg += m_bins[i];
    m_binStdDev += m_bins[i] * m_bins[i];
    ++result;
  }

  m_bassIntensity /= static_cast<float>(bassSamples);
  m_binAvg /= static_cast<float>(WINDOW_SIZE / 2);
  m_binStdDev = sqrt(m_binStdDev / (WINDOW_SIZE / 2) - (m_binAvg * m_binAvg));

  computeLights();

}