synfilt.h
上传用户:hxb_1234
上传日期:2010-03-30
资源大小:8328k
文件大小:3k
源码类别:

VC书籍

开发平台:

Visual C++

  1. /*
  2.  *  @(#) synthesis_filter.h 1.8, last edit: 6/15/94 16:52:00
  3.  *  @(#) Copyright (C) 1993, 1994 Tobias Bading (bading@cs.tu-berlin.de)
  4.  *  @(#) Berlin University of Technology
  5.  *
  6.  *  This program is free software; you can redistribute it and/or modify
  7.  *  it under the terms of the GNU General Public License as published by
  8.  *  the Free Software Foundation; either version 2 of the License, or
  9.  *  (at your option) any later version.
  10.  *
  11.  *  This program is distributed in the hope that it will be useful,
  12.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  *  GNU General Public License for more details.
  15.  *
  16.  *  You should have received a copy of the GNU General Public License
  17.  *  along with this program; if not, write to the Free Software
  18.  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  19.  */
  20. #ifndef SYNTHESIS_FILTER_H
  21. #define SYNTHESIS_FILTER_H
  22. #include "all.h"
  23. #include "obuffer.h"
  24. // A class for the synthesis filter bank:
  25. // This class does a fast downsampling from 32, 44.1 or 48 kHz to 8 kHz, if ULAW is defined.
  26. // Frequencies above 4 kHz are removed by ignoring higher subbands.
  27. class SynthesisFilter
  28. {
  29.   static const real d[512];
  30.   real v1[512], v2[512];
  31.   real *actual_v; // v1 or v2
  32.   uint32 actual_write_pos; // 0-15
  33.   real samples[32]; // 32 new subband samples
  34.   uint32 channel;
  35.   real scalefactor;
  36.   void compute_new_v();
  37.   void compute_pcm_samples(Obuffer *buffer);
  38.   // Clips the pcm sample so it will fit in 16 bits
  39. #ifdef TRUNC_ROUNDING
  40.   inline int16 clip(real sample)
  41.   {
  42.    return ((sample > 32767.0f) ? (int16) 32767 :
  43.            ((sample < -32768.0f) ? (int16) -32768 :
  44.            ((sample < 0.0f) ? -((int16) (-sample + 0.5f))
  45.                 :   (int16) ( sample + 0.5f)) ));
  46.   }
  47. #else
  48.   inline int16 clip(real sample)
  49.   {
  50.    return ((sample > 32767.0f) ? 32767 :
  51.            ((sample < -32768.0f) ? -32768 :
  52.   (int16) sample));
  53.   }
  54. #endif // TRUNC_ROUNDING
  55. public:
  56.   SynthesisFilter(uint32 channelnumber, real scalefactor = 32768.0);
  57.   // the scalefactor scales the calculated float pcm samples to short values
  58.   // (raw pcm samples are in [-1.0, 1.0], if no violations occur)
  59.   void input_sample(real sample, uint32 subbandnumber)
  60.   {
  61.  samples[subbandnumber] = sample;
  62.   };
  63.   void calculate_pcm_samples(Obuffer *buffer);
  64. // calculate 32 PCM samples and put the into the Obuffer-object
  65.   void   reset();
  66.   // reset the synthesis filter
  67. };
  68. #endif