Hi everybody... i am new in signal processing.
something about me... i am a student of software Engineering, My name is
Juan and i live in Argentina.
I am migrating one application developed in VEE (Agilent) to c++. This is
my new task in my work. This application analyzes signals and then... use
that info to set some alarms.. Nothing complicated... so far..
everything goes fine.. until i have to use ifft. I did make a fft
algorithm to do everything... but when i do the ifft... the output data
from VEE (agilent) was not the same as my algorithm. So... I decide to
implement FFTW. And i have the same problem...
i have this input data. (size = 2048)
Agilent(VEE) c++
magnitude phase
0 , @0 0 , 0
0 , @0 0 , 0
0 , @0 0 , 0
0 , @0 0 , 0
0.276 , @121.5 0.276 , 121.5
0.2061, @-72.03 0.2061, -72.03
0 , @0 0 , 0
0 , @0 0 , 0
0 , @0 0 , 0
0 , @0 0 , 0
... ... ... ...
and the output data from the VEE (agilent)
-7.860034643685586E-005
-7.871299096183408E-005
-7.88070606286872E-005
-7.888302098921511E-005
-7.894133976812804E-005
-7.898248647698485E-005
-7.900693202945827E-005
-7.901514835816201E-005
-7.900760803327236E-005
-7.898478388317609E-005
-7.894714861737379E-005
-7.889517445186702E-005
-7.882933273725408E-005
-7.875009358975982E-005
-7.865792552541923E-005
-7.855329509763516E-005
-7.843666653832641E-005
..
and this is the output from c++ (FFTW)
0: 0.000235391 : 0.0241332
1: -0.000100984 : 0.0241359
2: -0.000437429 : 0.0241348
3: -0.000773924 : 0.0241297
4: -0.00111045 : 0.0241208
5: -0.00144697 : 0.024108
6: -0.00178348 : 0.0240913
..
I think that could be the type of the input data... because in agilent is
a waveform. And in my c++ application is real data..
In/out (FFTW)
data=(fftw_complex* ) fftw_malloc( sizeof( fftw_complex ) * (SIZE/2+1) );
ifft_result=(fftw_complex* ) fftw_malloc( sizeof( fftw_complex ) * (SIZE)
);
I am relative new in the Signal Processing... so i would need some help...
and if you know some books.. And excuse me for my English :D
have a nice day...:cool:
Problem with IFFT, any idea?
Started by ●July 17, 2008
Reply by ●July 17, 20082008-07-17
rapidiablo wrote:> Hi everybody... i am new in signal processing. > > something about me... i am a student of software Engineering, My name is > Juan and i live in Argentina. > > I am migrating one application developed in VEE (Agilent) to c++. This is > my new task in my work. This application analyzes signals and then... use > that info to set some alarms.. Nothing complicated... so far.. > > everything goes fine.. until i have to use ifft. I did make a fft > algorithm to do everything... but when i do the ifft... the output data > from VEE (agilent) was not the same as my algorithm. So... I decide to > implement FFTW. And i have the same problem... > > i have this input data. (size = 2048) > > Agilent(VEE) c++ > > magnitude phase > 0 , @0 0 , 0 > 0 , @0 0 , 0 > 0 , @0 0 , 0 > 0 , @0 0 , 0 > 0.276 , @121.5 0.276 , 121.5 > 0.2061, @-72.03 0.2061, -72.03 > 0 , @0 0 , 0 > 0 , @0 0 , 0 > 0 , @0 0 , 0 > 0 , @0 0 , 0 > ... ... ... ... > > and the output data from the VEE (agilent) > > -7.860034643685586E-005 > -7.871299096183408E-005 > -7.88070606286872E-005 > -7.888302098921511E-005 > -7.894133976812804E-005 > -7.898248647698485E-005 > -7.900693202945827E-005 > -7.901514835816201E-005 > -7.900760803327236E-005 > -7.898478388317609E-005 > -7.894714861737379E-005 > -7.889517445186702E-005 > -7.882933273725408E-005 > -7.875009358975982E-005 > -7.865792552541923E-005 > -7.855329509763516E-005 > -7.843666653832641E-005 > .. > > and this is the output from c++ (FFTW) > > 0: 0.000235391 : 0.0241332 > 1: -0.000100984 : 0.0241359 > 2: -0.000437429 : 0.0241348 > 3: -0.000773924 : 0.0241297 > 4: -0.00111045 : 0.0241208 > 5: -0.00144697 : 0.024108 > 6: -0.00178348 : 0.0240913 > .. > > I think that could be the type of the input data... because in agilent is > a waveform. And in my c++ application is real data.. > > In/out (FFTW) > data=(fftw_complex* ) fftw_malloc( sizeof( fftw_complex ) * (SIZE/2+1) ); > > ifft_result=(fftw_complex* ) fftw_malloc( sizeof( fftw_complex ) * (SIZE) > ); > > I am relative new in the Signal Processing... so i would need some help... > and if you know some books.. And excuse me for my English :D > > have a nice day...:cool: > >I suspect two things: First, everyone likes to scale their FFT and IFFT algorithms differently. Each one is the best -- just ask the author. So the fact that they're scaled differently is no big surprise. Check to see if they're off by 2048, 2048^2, or sqrt(2048), or any of those three with a factor of pi thrown in. Second, the fact that your Agilent program gives back a single column of numbers implies that it's a real FFT. If you're sticking your data into a complex FFT then you'd get back complex results, which isn't what you're looking for. See if taking these notions into consideration helps. -- Tim Wescott Wescott Design Services http://www.wescottdesign.com Do you need to implement control loops in software? "Applied Control Theory for Embedded Systems" gives you just what it says. See details at http://www.wescottdesign.com/actfes/actfes.html
Reply by ●July 18, 20082008-07-18
On Jul 17, 2:55 pm, "rapidiablo" <juan0...@hotmail.com> wrote:> i have this input data. (size = 2048) > > Agilent(VEE) c++ > > magnitude phase > 0 , @0 0 , 0 > 0 , @0 0 , 0 > 0 , @0 0 , 0 > 0 , @0 0 , 0 > 0.276 , @121.5 0.276 , 121.5 > 0.2061, @-72.03 0.2061, -72.03 > 0 , @0 0 , 0 > 0 , @0 0 , 0 > 0 , @0 0 , 0 > 0 , @0 0 , 0 > ... ... ... ...To be clear, the above is the data you need to ifft, so you have a complex array in C++ that looks like data = 0.00000000 : 0.00000000 0.00000000 : 0.00000000 0.00000000 : 0.00000000 0.00000000 : 0.00000000 -0.14420960 : 0.23532869 0.06358576 : -0.19604607 0.00000000 : 0.00000000 0.00000000 : 0.00000000 0.00000000 : 0.00000000 0.00000000 : 0.00000000 ... If the array is conjugate symmetric it will finish like this: ... 0.00000000 : 0.00000000 0.00000000 : 0.00000000 0.00000000 : 0.00000000 0.00000000 : 0.00000000 0.06358576 : 0.19604607 -0.14420960 : -0.23532869 0.00000000 : 0.00000000 0.00000000 : 0.00000000 0.00000000 : 0.00000000 With the conjugate symmetry shown above, a 2048-point ifft in scipy (a python package that uses either FFTPACK or FFTW) outputs the following: -7.87342198e-05 : -1.43836172e-12 -7.86143723e-05 : -1.44809333e-12 -7.84881940e-05 : -1.45767790e-12 ... -7.90531139e-05 : -1.40828912e-12 -7.89538571e-05 : -1.41845944e-12 -7.88474702e-05 : -1.42848388e-12 which agrees close enough with your VEE result for my money.> and this is the output from c++ (FFTW) > > 0: 0.000235391 : 0.0241332 > 1: -0.000100984 : 0.0241359 > 2: -0.000437429 : 0.0241348 > 3: -0.000773924 : 0.0241297 > 4: -0.00111045 : 0.0241208 > 5: -0.00144697 : 0.024108 > 6: -0.00178348 : 0.0240913 > .. > > I think that could be the type of the input data... because in agilent is > a waveform. And in my c++ application is real data.. > > In/out (FFTW) > data=(fftw_complex* ) fftw_malloc( sizeof( fftw_complex ) * (SIZE/2+1) ); > > ifft_result=(fftw_complex* ) fftw_malloc( sizeof( fftw_complex ) * (SIZE) > );Are you sure you stored your data properly in the array and are setting up your fftw_plan properly? Why is one array SIZE/2+1 in length while the other is SIZE? They should both have 2048 elements, no? (well, 4096 doubles, counting the real/imaginary components separately) A quick Google search pulled up this tutorial on FFTW: http://www-cecpv.u-strasbg.fr/Documentations/FFTW/v3.0.1/Complex-One-Dimensional-DFTs.html#Complex%20One-Dimensional%20DFTs By the way, you should be able to reinterpret_cast a C++ complex<double> * rather than use fftw_malloc. Both should just be a 2048x2 array of doubles. For example: const int SIZE = 2048; complex<double> *data = new complex<double>[SIZE]; complex<double> *ifft_result = new complex<double>[SIZE]; // ... fftw_plan p; p = fftw_plan_dft_1d( SIZE, reinterpret_cast<fftw_complex*>(data), reinterpret_cast<fftw_complex*>(ifft_result), FFTW_BACKWARD, FFTW_ESTIMATE); fftw_execute(p); // ... delete[] data; delete[] ifft_result;> I am relative new in the Signal Processing... so i would need some help... > and if you know some books.. And excuse me for my English :DThe Scientist and Engineer's Guide to DSP, a free online book, might be just what you need: http://www.dspguide.com/pdfbook.htm There's also the dspGuru site: http://www.dspguru.com -Eric
Reply by ●July 18, 20082008-07-18
Hi everybody again!! and thanx! everyone who have the time to help me..
Tim Wescott: The first thing you suspect may be my problem... but i dont
know how to determine what scale use Agilent VEE ??..
by the second thought.. I don´t know how to do it with the fftw library.
May be this is my problem... but i don't know how to do it with fftw
library... which method i have to use.. to calculate fft with complex input
and expect real output?. If you know!! PLEASE HELP!!
eric: thanks for your post!! you did well!! but... i cant get the result
that i expect.. :S
How do you get this results?
0.00000000 : 0.00000000
0.00000000 : 0.00000000
0.00000000 : 0.00000000
0.00000000 : 0.00000000
-0.14420960 : 0.23532869
0.06358576 : -0.19604607
0.00000000 : 0.00000000
0.00000000 : 0.00000000
0.00000000 : 0.00000000
0.00000000 : 0.00000000
by the way... i use those results in my ifft program and... i have
different output than yours. So may be my code wrong?? Here is the code...
And in the bottom i put the link to the files. CH00 and CH01 are the input
to my program.
IN IFFT(agilent).txt and IFFT out (agilent).txt: are the input to ifft in
agilent and the output from it.
Note: Agilent make the same calculations that my program... and have the
same result until ifft. After ifft, everything goes to hell. :(
CODE:
#include <fftw3.h>
#include <cmath>
#include <iostream>
#include <fstream>
#include <conio.h>
#define SIZE 2048
#define span 4
#define fcorte 1.4
using namespace std;
void mag (fftw_complex *result, long asize);
void phase ( fftw_complex *result, long asize);
void magpha ( fftw_complex *result, long asize);
long mapi ( double vspan, double asize);
void dco (fftw_complex *result, fftw_complex *result2, long vmapi);
void alloc ( fftw_complex *result, long asize);
void fsave (fftw_complex *result, long asize);
double pha[1+(SIZE/2)];
double magn[1+(SIZE/2)];
long hifrec, lowfrec;
int main( int argc, char** argv )
{
double asize,vspan,vmapi;
char tmp [100];
fftw_complex *data, *fft_result, *ifft_result,*data2, *fft_result2,
*ifft_result2;
fftw_plan plan_forward, plan_backward, plan_forward2,
plan_backward2;
int i,n;
/* IN/OUT */
data=( fftw_complex* ) fftw_malloc( sizeof( fftw_complex ) * SIZE );
data2=( fftw_complex* ) fftw_malloc( sizeof( fftw_complex ) * SIZE );
fft_result=( fftw_complex* ) fftw_malloc( sizeof( fftw_complex ) * SIZE
);
fft_result2=( fftw_complex* ) fftw_malloc( sizeof( fftw_complex ) * SIZE
);
ifft_result=( fftw_complex* ) fftw_malloc( sizeof( fftw_complex ) * SIZE
);
ifft_result2=( fftw_complex* ) fftw_malloc( sizeof( fftw_complex ) * SIZE
);
/* make plans
*/
plan_forward = fftw_plan_dft_1d( SIZE, data, fft_result,
FFTW_FORWARD, FFTW_ESTIMATE );
plan_forward2 = fftw_plan_dft_1d( SIZE, data2, fft_result2,
FFTW_FORWARD, FFTW_ESTIMATE );
plan_backward = fftw_plan_dft_1d( SIZE, fft_result, ifft_result,
FFTW_BACKWARD, FFTW_ESTIMATE );
plan_backward2= fftw_plan_dft_1d( SIZE, fft_result2, ifft_result2,
FFTW_BACKWARD, FFTW_ESTIMATE );
/* Read CH1 & CH2*/
ifstream archivo;
archivo.open ("ch00.txt", ifstream::in);
if (archivo.is_open())
{
n = 0;
while (SIZE>=n)
//while (!archivo.eof()
{
archivo.getline (tmp,100);
data[n][0] = atof (tmp);
data[n][1] = 0.0;
n++;
}
}
else
{
cout << "Error al abrir el archivo";
}
archivo.close ();
ifstream archiv;
archiv.open ("ch01.txt", ifstream::in);
if (archiv.is_open())
{
n = 0;
while (SIZE>=n)
//while (!archivo.eof()
{
archiv.getline (tmp,100);
data2[n][0] = atof (tmp);
data2[n][1] = 0.0;
n++;
}
}
else
{
cout << "Error al abrir el archivo";
}
archiv.close ();
/* print initial data
*/
for( i = 0 ; i < (SIZE) ; i++ ) {
cout << i << ": " << data[i][0] << " : "<< data[i][1] <<endl;
}
getch();
for( i = 0 ; i < (SIZE) ; i++ ) {
cout << i << ": " << data2[i][0] << " : "<< data2[i][1] <<endl;
}
getch();
/*execute ffts*/
fftw_execute( plan_forward ); //Ejecuta el plan A
fftw_execute( plan_forward2); //Ejecuta el plan A.1
/* print fft result
*/
for( i = 0 ; i < SIZE/2+1 ; i++ ) {
cout << i << ": " << fft_result[i][0] << " : " << fft_result[i][1]
<< endl;
}
getch();
for( i = 0 ; i < SIZE/2+1 ; i++ ) {
cout << i << ": " << fft_result2[i][0] << " : " << fft_result2[i][1]
<< endl;
}
getch();
asize=SIZE/2+1;
mag (fft_result,asize);
phase(fft_result,asize);
magpha(fft_result,asize);
mag (fft_result2,asize);
phase(fft_result2,asize);
magpha(fft_result2,asize);
for( i = 0 ; i < asize ; i++ ) {
cout << i << ": " << fft_result[i][0] << " : " << fft_result[i][1]
<< endl;
}
getch();
for( i = 0 ; i < asize ; i++ ) {
cout << i << ": " << fft_result2[i][0] << " : " << fft_result2[i][1]
<< endl;
}
getch();
vspan = asize/span; /*Calcula el Stop del Star/Stop del agilent*/
vmapi = mapi(vspan,asize);
dco (fft_result,fft_result2,vmapi);
alloc(fft_result,asize);
alloc(fft_result2,asize);
fsave(fft_result,asize);
for( i = 0 ; i < asize ; i++ ) {
cout << i << ": " << fft_result[i][0] << " : " << fft_result[i][1]
<< endl;
}
getch();
for( i = 0 ; i < asize ; i++ ) {
cout << i << ": " << fft_result2[i][0] << " : " << fft_result2[i][1]
<< endl;
}
getch();
fftw_execute( plan_backward ); //Ejecuta el plan B
fftw_execute( plan_backward2 ); //Ejecuta el plan B.1
/* print ifft result
*/
for( i = 0 ; i < SIZE ; i++ ) {
cout << i << ": " << ifft_result[i][0] / SIZE << " : " <<
fft_result[i][1] << endl;
}
getch();
for( i = 0 ; i < SIZE ; i++ ) {
cout << i << ": " << ifft_result2[i][0] / SIZE << " : " <<
fft_result2[i][1] << endl;
}
getch();
/* free memory
*/
fftw_destroy_plan( plan_forward );
fftw_destroy_plan( plan_backward );
fftw_destroy_plan( plan_forward2);
fftw_destroy_plan( plan_backward2);
fftw_free( data );
fftw_free( fft_result );
fftw_free( ifft_result );
fftw_free( data2 );
fftw_free( fft_result2 );
fftw_free( ifft_result2 );
return 0;
}
//////////////////////////////////////////////////PHASE////////////////////////
/* this function calculate phase.*/
void phase ( fftw_complex *result, long asize)
{
long n;
double atan;
for ( n = 0; n < asize ; n++ )
{
atan=atan2(result[n][1], result[n][0]);
pha[n]=atan*(180/3.14159265);
}
}
//////////////////////////////////////////////////MAGNITUD////////////////
/* this function calculate sqrt(a^2+b^2).*/
void mag (fftw_complex *result, long asize)
{
long n;
for ( n = 0; n < asize ; n++ )
{
magn[n]=sqrt(pow(result[n][0],2) + pow(result[n][1],2));
}
}
//////////////////////////////////////////////MAG-PHASE///////////////////
/*this function use mag and phase to make a new array with magnitude and
phase data*/
void magpha ( fftw_complex *result, long asize)
{
long n;
double atan;
for ( n = 0; n < asize ; n++ )
{
result[n][0] = magn[n];
result[n][1] = pha[n];
}
}
///////////////////////////////MAP A INDEX//////////////////////////
long mapi ( double vspan, double asize)
{
double resultado, intpart, fractpart;
resultado = fcorte*(asize/vspan);
fractpart = modf(resultado,&intpart);
if (fractpart>0.5)
{
intpart = intpart + 1;
}
return intpart;
}
/////////////////////////////////////////CUT///////////////////////////////////
/*this function and "map a index" finds hifrec and lowfrec. With this
values i set up the new array*/
void dco (fftw_complex *result, fftw_complex *result2, long vmapi)
{
long a, pico;
int hifrec1, hifrec2, lowfrec1, lowfrec2, n, flag;
//maxIndex([x[a-1],x[a],x[a+1]])+a-1
if (result[vmapi-1][0]>=result[vmapi][0]) a=0;
else a=1;
if (result[vmapi][0]>=result[vmapi+1][0]) a=1;
else a=2;
pico = a + vmapi - 1;
hifrec1 = pico;
hifrec2 = pico;
lowfrec1 = pico;
lowfrec2 = pico;
n = pico;
flag = 0;
while (flag==0)
{
if (result[n+1][0] <= result[n][0]) n=n+1;
else
{
lowfrec1=n;
flag=1;
}
}
flag=0;
n = pico;
while (flag==0)
{
if (result2[n+1][0] <= result2[n][0]) n=n+1;
else
{
lowfrec2=n;
flag=1;
}
}
flag = 0;
n = pico;
while (flag==0)
{
if (result[n-1][0] <= result[n][0])
{
n=n-1;
if (n==0)
{
hifrec1=n;
flag=1;
}
}
else
{
hifrec1=n;
flag=1;
}
}
flag = 0;
n = pico;
while (flag==0)
{
if (result2[n-1][0] <= result2[n][0])
{
n=n-1;
if (n==0)
{
hifrec2=n;
flag=1;
}
}
else
{
hifrec2=n;
flag=1;
}
}
if (lowfrec1>lowfrec2) lowfrec=lowfrec2;
else lowfrec=lowfrec1;
if (hifrec1>hifrec2) hifrec=hifrec1;
else hifrec=hifrec2;
}
//////////////////////////////ALLOC////////////////////////////////
/*this function make a new array with all values at 0.0 and copy the
hifrec and lowfrec from the original fft array (magnitude,phase)*/
void alloc ( fftw_complex *result, long asize)
{
int n=0;
double tmp1,tmp2;
while (asize>=n)
{
if (n==hifrec){}
else
{
if (n==lowfrec){}
else
{
result[n][0] = 0.0;
result[n][1] = 0.0;
}
}
n=n+1;
}
/*
tmp1=result[hifrec][0];
tmp2=result[hifrec][1];
result[hifrec][0]=result[lowfrec][0];
result[hifrec][1]=result[lowfrec][1];
result[lowfrec][0]=tmp1;
result[lowfrec][1]=tmp2;*/
}
//////////////////////////////SAVE////////////////////////
void fsave (fftw_complex *result, long asize)
{
int n;
ofstream fsalida;
fsalida.open("salida.TXT");
for ( n = 0; n < asize ; n++ )
{
fsalida << result[n][0] << "," << result[n][1] << endl;
}
fsalida.close();
}
Files:
IN IFFT(agilent).txt:
http://www.4shared.com/file/55678120/d91bbce1/IN_IFFT_agilent_.html
IFFT out (agilent).txt:
http://www.4shared.com/file/55678126/307819d4/IFFT_out__agilent_.html
CHO1:
http://www.4shared.com/file/55678122/3715ddcd/CH01.html
CH00:
http://www.4shared.com/file/55678124/de7678f8/CH00.html
Hope you understand my English and THANKS FOR EVERY HELP... I NEED IT...!
Have a nice day!!
Reply by ●July 18, 20082008-07-18
eric!! now i know how you get this results 0.00000000 : 0.00000000 0.00000000 : 0.00000000 0.00000000 : 0.00000000 0.00000000 : 0.00000000 -0.14420960 : 0.23532869 0.06358576 : -0.19604607 0.00000000 : 0.00000000 0.00000000 : 0.00000000 0.00000000 : 0.00000000 0.00000000 : 0.00000000 You FFT them.. :) But.. i cant get the results form agilen... :( HELP!!!! thanxs!
Reply by ●July 18, 20082008-07-18
I forgot some info about agilent vee... This info about the input, could be my problem?? IN IFFT(agilent).txt: Type: Spectrum shape: Array 1D Size: 1025 mapping: LIN:0 ... 256.25 Thanks again and again..
Reply by ●July 18, 20082008-07-18
On Jul 18, 11:08�am, "rapidiablo" <juan0...@hotmail.com> wrote:> eric!! now i know how you get this results > > �0.00000000 : �0.00000000 > �0.00000000 : �0.00000000 > �0.00000000 : �0.00000000 > �0.00000000 : �0.00000000 > -0.14420960 : �0.23532869 > �0.06358576 : -0.19604607 > �0.00000000 : �0.00000000 > �0.00000000 : �0.00000000 > �0.00000000 : �0.00000000 > �0.00000000 : �0.00000000 > > You FFT them.. :) > > But.. i cant get the results form agilen... :( > > HELP!!!! > > thanxs!Those were your numbers. I simply took the amplitude/phase data you gave me and recreated the array so I could test it using the ifft in scipy. Now I have the precise numbers from IN IFFT(agilent).txt: fft_result = 0: 0.00000000 : 0.00000000 1: 0.00000000 : 0.00000000 2: 0.00000000 : 0.00000000 3: 0.00000000 : 0.00000000 4: 0.00000000 : 0.00000000 5: 0.00000000 : 0.00000000 6:-0.14404949: 0.23546151 7: 0.06356274 : -0.19600286 8: 0.00000000 : 0.00000000 ... 2040: 0.00000000 : 0.00000000 2041: 0.06356274 : 0.19600286 2042:-0.14404949: -0.23546151 2043: 0.00000000 : 0.00000000 2044: 0.00000000 : 0.00000000 2045: 0.00000000 : 0.00000000 2046: 0.00000000 : 0.00000000 2047: 0.00000000 : 0.00000000 ifft_result: -7.86003464e-05 : 0.00000000e+00 -7.87129910e-05 : -4.06575815e-20 -7.88070606e-05 : -1.35525272e-20 ... -7.81463489e-05 : -3.72112162e-19 -7.83174838e-05 : -3.86816124e-19 -7.84686641e-05 : -4.15979204e-19 For reference, these are the corresponding values from IFFT out (agilent).txt : -7.860034643685586E-005 -7.871299096183408E-005 -7.88070606286872E-005 ... -7.814634892479629E-005 -7.831748379365282E-005 -7.846866406201685E-005 Unsurprisingly, they agree, which means the problem is in the C code.
Reply by ●July 18, 20082008-07-18
ERIC!!! YOU ARE A GENIUS!!! I DON´T KNOW HOW TO THANKS YOU!!! ... The answer of my problem was in front of me !!! and i dint see it!! when you say: To be clear, the above is the data you need to ifft, so you have a complex array in C++ that looks like data = 0.00000000 : 0.00000000 0.00000000 : 0.00000000 0.00000000 : 0.00000000 0.00000000 : 0.00000000 -0.14420960 : 0.23532869 0.06358576 : -0.19604607 0.00000000 : 0.00000000 0.00000000 : 0.00000000 0.00000000 : 0.00000000 0.00000000 : 0.00000000 .. If the array is conjugate symmetric it will finish like this: .. 0.00000000 : 0.00000000 0.00000000 : 0.00000000 0.00000000 : 0.00000000 0.00000000 : 0.00000000 0.06358576 : 0.19604607 -0.14420960 : -0.23532869 0.00000000 : 0.00000000 0.00000000 : 0.00000000 0.00000000 : 0.00000000 With the conjugate symmetry shown above, a 2048-point ifft in scipy (a python package that uses either FFTPACK or FFTW) outputs the following: .. my problem was that i just have an array of the half of the size and i never conjugate the values!!! so i have a 1025 arry in!! with the half of the data!!! in your last post!! i realized... what you told me in the first... (in the beginning i belive you just turn the values... for alien reason.. jeje) because you put the numbers of the elements (index). 0: 0.00000000 : 0.00000000 1: 0.00000000 : 0.00000000 2: 0.00000000 : 0.00000000 3: 0.00000000 : 0.00000000 4: 0.00000000 : 0.00000000 5: 0.00000000 : 0.00000000 6:-0.14404949: 0.23546151 7: 0.06356274 : -0.19600286 8: 0.00000000 : 0.00000000 =2E.. 2040: 0.00000000 : 0.00000000 2041: 0.06356274 : 0.19600286 2042:-0.14404949: -0.23546151 2043: 0.00000000 : 0.00000000 2044: 0.00000000 : 0.00000000 2045: 0.00000000 : 0.00000000 2046: 0.00000000 : 0.00000000 2047: 0.00000000 : 0.00000000 So... that was the problem!!! THANKS MEN!! ... Sorry about my English again... i do the best i can!! jeje.. Thxk every body!! :) xD. (im happy)
Reply by ●July 18, 20082008-07-18
On Jul 18, 10:47�am, "rapidiablo" <juan0...@hotmail.com> wrote:> � � vspan = asize/span; �/*Calcula el Stop del Star/Stop del agilent*/ > � � vmapi = mapi(vspan,asize); > � � dco (fft_result,fft_result2,vmapi);In the above code you're calculating the global variables hifrec and lowfrec, right?> � � alloc(fft_result,asize); > � � alloc(fft_result2,asize);Then you zero out everything but those two frequencies in the alloc function, right? But you only do that to elements 0 through 1025, leaving 1026 to 2047 unmodified. As an aside, I think your while loop exit condition in alloc() should have been (asize>n) rather than (asize>=n) since asize equals 1025. Element 0 is DC (0 Hz), and element 1024 is half the sampling frequency (digital frequency pi/2). For a real signal with 2048 sample points, elements 1025-2047 of the DFT (fft) are the conjugated mirror of elements 1-1023, so they don't provide any extra information, which is why they're often ignored.> � � fftw_execute( plan_backward ); �//Ejecuta el plan B > � � fftw_execute( plan_backward2 ); //Ejecuta el plan B.1Then you ifft your modified results. I think I see your problem. You need to zero out the conjugate symmetric frequencies in the 1025-2047 range, except the two at (SIZE - hifrec) and (SIZE - lowfrec). If you don't your result will not match VEE and will be complex valued. I hope this solves your problem. -Eric
Reply by ●July 18, 20082008-07-18
I already did that... everything works just fine!!! thanks eric!!.. you are a pro!! jeje!>On Jul 18, 10:47=A0am, "rapidiablo" <juan0...@hotmail.com> wrote: > >> =A0 =A0 vspan =3D asize/span; =A0/*Calcula el Stop del Star/Stop delagil=>ent*/ >> =A0 =A0 vmapi =3D mapi(vspan,asize); >> =A0 =A0 dco (fft_result,fft_result2,vmapi); > >In the above code you're calculating the global variables hifrec and >lowfrec, right? > >> =A0 =A0 alloc(fft_result,asize); >> =A0 =A0 alloc(fft_result2,asize); > >Then you zero out everything but those two frequencies in the alloc >function, right? But you only do that to elements 0 through 1025, >leaving 1026 to 2047 unmodified. > >As an aside, I think your while loop exit condition in alloc() should >have been (asize>n) rather than (asize>=3Dn) since asize equals 1025. >Element 0 is DC (0 Hz), and element 1024 is half the sampling >frequency (digital frequency pi/2). For a real signal with 2048 sample >points, elements 1025-2047 of the DFT (fft) are the conjugated mirror >of elements 1-1023, so they don't provide any extra information, which >is why they're often ignored. > >> =A0 =A0 fftw_execute( plan_backward ); =A0//Ejecuta el plan B >> =A0 =A0 fftw_execute( plan_backward2 ); //Ejecuta el plan B.1 > >Then you ifft your modified results. > >I think I see your problem. You need to zero out the conjugate >symmetric frequencies in the 1025-2047 range, except the two at (SIZE >- hifrec) and (SIZE - lowfrec). If you don't your result will not >match VEE and will be complex valued. I hope this solves your >problem. > >-Eric >






