⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 psd_bar_floatpt.c

📁 用dsp解压mp3程序的算法
💻 C
字号:
/*****************************************************************
*  psd_bar_floatpt.c - C program for FFT-based PSD using
*                      Bartlett periodogram
******************************************************************
*  System configuration:
*
*          _____     ____     __________     __________     ____    
*         |     |   |    |   |          |   |          |   |    |
*  x(n)-->| Buf |-->| BR |-->| (1/N)*FFT|-->| |X(k)|^2 |-->| Av |-> Pi(k)
*         |_____|   |____|   |__________|   |__________|   |____|  
*                   
*           
*  (b) Bartlett Periodigram
******************************************************************
*  System simulation configuration:
*
*     x(n) is the input data from data file "in.dat"
*     (assuming that the length of x(n) has been zero padded to 
*      the right length for averaged periodogram)
*     out(n) is the power spectrum data to data file "out.dat"
*
*****************************************************************/

#include <stdio.h>          /* header files          */
#include <stdlib.h>
#include <math.h>   

#include "def_complex.h"    /* complex.h header file */

/* External functions                                */

extern void ditr2fft(complex *, unsigned int, complex *, unsigned int);
extern void bit_reversal(complex *, unsigned int);

/* variables and constants                           */

#define N 256           /* number of FFT points      */
#define EXP 8           /* EXP=log2(N)               */
#define pi 3.1415926535897  
#define K 2             /* K = int(length(x)/N)      */ 
                       
complex X[N];           /* declare input array       */
complex W[EXP];         /* twiddle e^(-j2pi/N) table */    
complex temp;
float spectrum[K][N];
float spectrum_av[N];
float xn;

void main()
{
  unsigned int i,j,L,LE,LE1; 
 
  /***************************************************************
  *    Declare file pointers
  ***************************************************************/

  FILE *xn_in;                    /* file pointer of x(n)       */
  FILE *yn_out;                   /* file pointer of y(n)       */
  xn_in = fopen("in.dat","r");    /* open file for input x(n)   */
  yn_out = fopen("out.dat","w");  /* open file for output y(n)  */


  /* Step 1: Create a twiddle factor table */
  for (L=1; L<=EXP; L++)          /* create twiddle factor table */
  {
    LE=1<<L;                      /* LE=2^L=points of sub DFT */
    LE1=LE>>1;     	         /* number of butterflies in sub-DFT */
    W[L-1].re = cos(pi/LE1);
    W[L-1].im = -sin(pi/LE1);
  }    
  for(i=0; i<N; i++)
  {
    spectrum_av[i] = 0.0;
  }

  for (j=0; j<K; j++)
  {
    /* Step 2: Enter input data to reference buffer */

    for(i=0; i<N; i++)
    {	/* segment input signal */
      fscanf(xn_in,"%f",&xn) ;
      {	
	X[i].re = xn;
	X[i].im = 0.0;
      }
    }

    /* Step 3: Perform bit reversal, follow by FFT */
    /* Start FFT */
    bit_reversal(X,EXP);        /* arrange X[] in bit-reverse order              */
    ditr2fft(X,EXP,W,1);	/* perform FFT with scaling of 0.5 in each stage */

	/* Step 4: Perform magnitude-square and display results in MATLAB        */
    for (i=0; i<N; i++)         /* verify FFT result                             */
    {
      temp.re = X[i].re*X[i].re;
      temp.im = X[i].im*X[i].im;        
      spectrum[j][i] = (temp.re+temp.im);  /* scaling is perform in fft          */	
    }
  }

  /* Step 5: Perform averaging... */
  for (j=0; j<K; j++)
  {
    for (i=0; i<N; i++)
    {
      spectrum_av[i] = spectrum[j][i]+spectrum_av[i];
    }
  }

  for (i=0;i<N; i++)
  {
    spectrum_av[i]=spectrum_av[i]/K;
    fprintf(yn_out,"%f\n",spectrum_av[i]);
  }
  fcloseall();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -