[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Help-gsl] Re: FFT(INVFFT) is not returning original data!
From: |
Sumit Adhikari |
Subject: |
[Help-gsl] Re: FFT(INVFFT) is not returning original data! |
Date: |
Mon, 11 Jan 2010 15:24:41 +0530 |
A small correction ... "not returning"
Sorry for the inconvenience.
On Mon, Jan 11, 2010 at 3:22 PM, Sumit Adhikari <address@hidden>wrote:
> Hello All,
> Following function is returning me the original data. Can anybody please
> tell me what is the problem I am doing with it ?
>
>
> # ifndef SC_FFT_H
> # define SC_FFT_H
>
> # include <cmath>
>
> # include "systemc.h"
>
> # include "m_signal_inout_if.h"
> # include "m_signal_in_if.h"
>
>
> # include <gsl/gsl_errno.h>
> # include <gsl/gsl_fft_complex.h>
>
> # include "hann.h"
>
>
> # define REAL(z,i) ((z) [2*(i)])
> # define IMAG(z,i) ((z) [2*(i) + 1])
>
> template < typename T > class sc_fft : public sc_module {
> public :
> sc_port < m_signal_in_if < T > > inp ;
> sc_port < m_signal_inout_if < T > > out ;
> sc_port < m_signal_inout_if < bool > > tx ;
> sc_port < m_signal_inout_if < T > > freq;
>
>
> typedef sc_fft SC_CURRENT_USER_MODULE ;
>
> sc_fft(sc_module_name name,const unsigned Nfft,T Offset):
> inp("inp"),
> out("out"),
> tx("tx"),
> freq("freq"),
> sc_module(name),
> _Nfft(Nfft) ,
> _Offset(Offset) {
>
> Npoints = _Nfft ;
>
> i = 0 ;
>
> fft_inp_buff = (double*) malloc (_Nfft * sizeof(double));
> fft_inp_buff = new double [_Nfft] ;
>
> fft_trn_buff = (double*) malloc (2*_Nfft * sizeof(double));
> fft_trn_buff = new double [2*_Nfft] ;
>
> fft_out_buff = (double*) malloc (_Nfft * sizeof(double));
> fft_out_buff = new double [_Nfft] ;
>
>
> SC_METHOD(read);
> sensitive << inp ;
> }
>
>
> private :
> const unsigned _Nfft ;
> T _Offset ;
> unsigned Npoints ;
> unsigned i ;
> double* fft_inp_buff ;
> double* fft_trn_buff ;
> double* fft_out_buff ;
>
>
> void inline read(){
> if (i == (Npoints - 1)) {
> i = 0 ;
>
> for(int j = 0 ; j < Npoints ; j++) {
> REAL(fft_trn_buff,j) = fft_inp_buff[j];
> IMAG(fft_trn_buff,j) = 0.0 ;
> }
>
> int fstatus =
> gsl_fft_complex_radix2_forward(fft_trn_buff,1,Npoints);
> int rstatus =
> gsl_fft_complex_radix2_inverse(fft_trn_buff,1,Npoints);
> for(int j = 0 ; j < Npoints ; j++) fft_out_buff[j] =
> sqrt(REAL(fft_trn_buff,j)*REAL(fft_trn_buff,j) +
> IMAG(fft_trn_buff,j)*IMAG(fft_trn_buff,j)) ;
>
>
> fft_inp_buff[i] = (double) (inp->read() - _Offset);
> out->write((T) fft_out_buff[i]);
> tx->write(true);
>
> }
> else {
> i ++ ;
>
> fft_inp_buff[i] = (double) (inp->read() - _Offset) ;
> out->write((T) fft_out_buff[i]);
> tx->write(false);
> }
>
> freq->write((T) i);
> }
>
>
> };
>
>
> # endif
>
> Regards,
>
> Sumit
>
--
--------------------------------------------
Sumit Adhikari
System Design Engineer
austriamicrosystems AG
Business Unit : Automotive
Mob : 00-91-9885271710/00-91-9000161710