How to get phase spectrum after do FFT Topic is solved

Voice related projects and technical discussions
link0513
Member++
Posts: 26
Joined: Tue Jul 02, 2019 8:38 am

How to get phase spectrum after do FFT

Post by link0513 »

I use dsp_fft_bit_reverse_and_forward_real function to get the a sequence of imaginary and real numbers. Is there the function to get phase spectrum? So that I can do IFFT to get the data what I want if I do some operation in this sequence
View Solution
User avatar
CousinItt
Respected Member
Posts: 367
Joined: Wed May 31, 2017 6:55 pm

Post by CousinItt »

You can use dsp_math_atan2_hypot() to convert each complex number to polar form.
link0513
Member++
Posts: 26
Joined: Tue Jul 02, 2019 8:38 am

Post by link0513 »

CousinItt wrote: Fri Jul 19, 2019 11:20 am You can use dsp_math_atan2_hypot() to convert each complex number to polar form.
Hi, How to do that. Actually, I don't know the algorithm very well. I find the way from internet to get the phase and want to recover signal by amplitude and phase, but when I input 1k Hz, there is 90 degree phase difference between input and output.

Code: Select all


    dsp_fft_bit_reverse_and_forward_real(sample,512,dsp_sine_256,dsp_sine_512);    
    dsp_complex_t * local = (int32_t *)sample;
    dsp_complex_window_hanning_post_fft_half(local,FEEDBACK_SAMPLE_MAX);  //add window

    for(int i = 0; i < BUFEER_SIZE; i++)  
    {
        if(i==0)
        {     p_state->fft_data0_re= local[i].re; p_state->fft_data0_im = local[i].im;}                //store the local[0]
        else
        {
            temp = dsp_math_multiply(local[i].re, local[i].re, 24)+ dsp_math_multiply(local[i].im, local[i].im, 24);         //   temp = sqrt(re^2 + im^2)
            temp = dsp_math_sqrt(temp);
      
            p_state->fftFrqArray[i]= temp;  
       	    p_state->angle[i] = dsp_math_atan(dsp_math_divide(local[i].im, local[i].re, 24));                                       // calculate the phase
       }
    }
      for(int i =1; i< BUFEER_SIZE;i++)
     {
        local[i].re=dsp_math_multiply(p_state->fftFrqArray[i],dsp_math_cos(p_state->angle[i]),24);                            // re = temp * cos(phase)
        local[i].im=dsp_math_multiply(p_state->fftFrqArray[i],dsp_math_sin(p_state->angle[i]),24);			    // im= temp * sin(phase)
     } 
     
   dsp_fft_bit_reverse_and_inverse_real(local,512,dsp_sine_256,dsp_sine_512);
   
Last edited by link0513 on Mon Jul 22, 2019 8:18 am, edited 1 time in total.
link0513
Member++
Posts: 26
Joined: Tue Jul 02, 2019 8:38 am

Post by link0513 »

The above code is reference matlab code

Code: Select all

mag = abs(F);
mag =  sqrt(real(F).^2 + imag(F).^2);
phase = atan2(imag(F),real(F));
re = mag .* cos(phase);
im = mag .* sin(phase);
F = re + 1i*im;
f = ifft2(F);

link0513
Member++
Posts: 26
Joined: Tue Jul 02, 2019 8:38 am

Post by link0513 »

By the way, I try to use below code to instead of p_state->angle = dsp_math_atan(dsp_math_divide(local.im, local.re, 24));, but the phase of the output signal is still wrong. Anybody know why? Please!!!

Code: Select all

           loca_im_re[0] = local[i].re;
           loca_im_re[1] = local[i].im;
           dsp_math_atan2_hypot(loca_im_re,0);
           p_state->angle[i] = loca_im_re[1]; 
           p_state->angle[i] = dsp_math_multiply(p_state->angle[i],PI_Q8_24,24);               // Transfer the angle to radian.  angle*pi/180 = radian
           p_state->angle[i] = dsp_math_divide(p_state->angle[i],Q24(180),24);
           
link0513
Member++
Posts: 26
Joined: Tue Jul 02, 2019 8:38 am

Post by link0513 »

This problem is solved.