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

📄 gri_fft.cc

📁 gnuradio软件无线电源程序.现在的手机多基于软件无线电
💻 CC
字号:
/* -*- c++ -*- *//* * Copyright 2003 Free Software Foundation, Inc. *  * This file is part of GNU Radio *  * GNU Radio is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. *  * GNU Radio is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. *  * You should have received a copy of the GNU General Public License * along with GNU Radio; see the file COPYING.  If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */#include <gri_fft.h>#include <fftw3.h>#include <gr_complex.h>#include <stdlib.h>#include <string.h>#include <stdio.h>#include <cassert>#include <stdexcept>static char *wisdom_filename (){  static char *filename = ".gr_fftw_wisdom";  char	*home = getenv ("HOME");  if (home){    char *p = new char[strlen (home) + strlen (filename) + 2];    strcpy (p, home);    strcat (p, "/");    strcat (p, filename);    return p;  }  return 0;}static void gri_fftw_import_wisdom (){  char *filename = wisdom_filename ();  FILE *fp = fopen (filename, "r");  if (fp != 0){    int r = fftwf_import_wisdom_from_file (fp);    fclose (fp);    if (!r){      fprintf (stderr, "gri_fftw: can't import wisdom from %s\n", filename);    }  }  delete [] filename;}static voidgri_fftw_export_wisdom (){  char *filename = wisdom_filename ();  FILE *fp = fopen (filename, "w");  if (fp != 0){    fftwf_export_wisdom_to_file (fp);    fclose (fp);  }  else {    fprintf (stderr, "gri_fftw: ");    perror (filename);  }  delete [] filename;}// ----------------------------------------------------------------gri_fft_complex::gri_fft_complex (int fft_size, bool forward){  assert (sizeof (fftwf_complex) == sizeof (gr_complex));    if (fft_size <= 0)    throw std::out_of_range ("gri_fftw: invalid fft_size");    d_fft_size = fft_size;  d_inbuf = (gr_complex *) fftwf_malloc (sizeof (gr_complex) * inbuf_length ());  if (d_inbuf == 0)    throw std::runtime_error ("fftwf_malloc");    d_outbuf = (gr_complex *) fftwf_malloc (sizeof (gr_complex) * outbuf_length ());  if (d_outbuf == 0){    fftwf_free (d_inbuf);    throw std::runtime_error ("fftwf_malloc");  }  // FIXME If there's ever a chance that the planning functions  // will be called in multiple threads, we've got to ensure single  // threaded access.  They are not thread-safe.    gri_fftw_import_wisdom ();	// load prior wisdom from disk  d_plan = fftwf_plan_dft_1d (fft_size,			      reinterpret_cast<fftwf_complex *>(d_inbuf), 			      reinterpret_cast<fftwf_complex *>(d_outbuf),			      forward ? FFTW_FORWARD : FFTW_BACKWARD,			      FFTW_MEASURE);  if (d_plan == NULL) {    fprintf(stderr, "gri_fft_complex: error creating plan\n");    throw std::runtime_error ("fftwf_plan_dft_1d failed");  }  gri_fftw_export_wisdom ();	// store new wisdom to disk}gri_fft_complex::~gri_fft_complex (){  fftwf_destroy_plan ((fftwf_plan) d_plan);  fftwf_free (d_inbuf);  fftwf_free (d_outbuf);}voidgri_fft_complex::execute (){  fftwf_execute ((fftwf_plan) d_plan);}// ----------------------------------------------------------------gri_fft_real::gri_fft_real (int fft_size){  assert (sizeof (fftwf_complex) == sizeof (gr_complex));    if (fft_size <= 0)    throw std::out_of_range ("gri_fftw: invalid fft_size");    d_fft_size = fft_size;  d_inbuf = (float *) fftwf_malloc (sizeof (float) * inbuf_length ());  if (d_inbuf == 0)    throw std::runtime_error ("fftwf_malloc");    d_outbuf = (gr_complex *) fftwf_malloc (sizeof (gr_complex) * outbuf_length ());  if (d_outbuf == 0){    fftwf_free (d_inbuf);    throw std::runtime_error ("fftwf_malloc");  }  // FIXME If there's ever a chance that the planning functions  // will be called in multiple threads, we've got to ensure single  // threaded access.  They are not thread-safe.    gri_fftw_import_wisdom ();	// load prior wisdom from disk  d_plan = fftwf_plan_dft_r2c_1d (fft_size,				  d_inbuf,				  reinterpret_cast<fftwf_complex *>(d_outbuf),				  FFTW_MEASURE);  if (d_plan == NULL) {    fprintf(stderr, "gri_fft_real: error creating plan\n");    throw std::runtime_error ("fftwf_plan_dft_r2c_1d failed");  }  gri_fftw_export_wisdom ();	// store new wisdom to disk}gri_fft_real::~gri_fft_real (){  fftwf_destroy_plan ((fftwf_plan) d_plan);  fftwf_free (d_inbuf);  fftwf_free (d_outbuf);}voidgri_fft_real::execute (){  fftwf_execute ((fftwf_plan) d_plan);}

⌨️ 快捷键说明

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