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

📄 gr_wavfile_source.cc

📁 这是用python语言写的一个数字广播的信号处理工具包。利用它
💻 CC
字号:
/* -*- c++ -*- *//* * Copyright 2004,2008 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 3, 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., 51 Franklin Street, * Boston, MA 02110-1301, USA. */#ifdef HAVE_CONFIG_H#include "config.h"#endif#include <gr_wavfile_source.h>#include <gr_io_signature.h>#include <gri_wavfile.h>#include <cstdio>#include <sys/types.h>#include <fcntl.h>#include <stdexcept>// win32 (mingw/msvc) specific#ifdef HAVE_IO_H#include <io.h>#endif#ifdef O_BINARY#define	OUR_O_BINARY O_BINARY#else#define	OUR_O_BINARY 0#endif// should be handled via configure#ifdef O_LARGEFILE#define	OUR_O_LARGEFILE	O_LARGEFILE#else#define	OUR_O_LARGEFILE 0#endifgr_wavfile_source_sptrgr_make_wavfile_source (const char *filename, bool repeat){  return gr_wavfile_source_sptr (new gr_wavfile_source (filename, repeat));}gr_wavfile_source::gr_wavfile_source (const char *filename, bool repeat)  : gr_sync_block ("wavfile_source",		   gr_make_io_signature (0, 0, 0),		   gr_make_io_signature (1, 2, sizeof(float))),    d_fp(NULL), d_repeat(repeat),    d_sample_rate(1), d_nchans(1), d_bytes_per_sample(2), d_first_sample_pos(0),    d_samples_per_chan(0), d_sample_idx(0){  // we use "open" to use to the O_LARGEFILE flag  int fd;  if ((fd = open (filename, O_RDONLY | OUR_O_LARGEFILE | OUR_O_BINARY)) < 0) {    perror (filename);    throw std::runtime_error ("can't open file");  }  if ((d_fp = fdopen (fd, "rb")) == NULL) {    perror (filename);    throw std::runtime_error ("can't open file");  }  // Scan headers, check file validity  if (!gri_wavheader_parse(d_fp,			   d_sample_rate,			   d_nchans,			   d_bytes_per_sample,			   d_first_sample_pos,			   d_samples_per_chan)) {    throw std::runtime_error("is not a valid wav file");  }    if (d_samples_per_chan == 0) {    throw std::runtime_error("WAV file does not contain any samples");  }  if (d_bytes_per_sample == 1) {    d_normalize_fac   = 128;    d_normalize_shift = 1;  } else {    d_normalize_fac   = 0x7FFF;    d_normalize_shift = 0;  }  // Re-set the output signature  set_output_signature(gr_make_io_signature(1, d_nchans, sizeof(float)));}gr_wavfile_source::~gr_wavfile_source (){  fclose(d_fp);}intgr_wavfile_source::work(int noutput_items,			gr_vector_const_void_star &input_items,			gr_vector_void_star &output_items){  float **out = (float **) &output_items[0];  int n_out_chans = output_items.size();  int i;  short sample;  for (i = 0; i < noutput_items; i++) {    if (d_sample_idx >= d_samples_per_chan) {      if (!d_repeat) {	// if nothing was read at all, say we're done.	return i ? i : -1;      }      if (fseek (d_fp, d_first_sample_pos, SEEK_SET) == -1) {	fprintf(stderr, "[%s] fseek failed\n", __FILE__);	exit(-1);      }      d_sample_idx = 0;    }        for (int chan = 0; chan < d_nchans; chan++) {      sample = gri_wav_read_sample(d_fp, d_bytes_per_sample);      if (chan < n_out_chans) {	out[chan][i] = convert_to_float(sample);      }    }    d_sample_idx++;        // OK, EOF is not necessarily an error. But we're not going to    // deal with handling corrupt wav files, so if they give us any    // trouble they won't be processed. Serves them bloody right.    if (feof(d_fp) || ferror(d_fp)) {      if (i == 0) {	fprintf(stderr, "[%s] WAV file has corrupted header or i/o error\n", __FILE__);	return -1;      }      return i;    }  }    return noutput_items;}floatgr_wavfile_source::convert_to_float(short int sample){  float sample_out = (float) sample;  sample_out /= d_normalize_fac;  sample_out -= d_normalize_shift;  return sample_out;}

⌨️ 快捷键说明

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