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

📄 class_definition_file_fir_filter.txt

📁 FIR滤波器的C++实现 Below are program source listings for FIR.h and FIR.cpp, the header file and class fil
💻 TXT
字号:
//Class definition file FIR.cpp 



#include "FIR.h"

#include <string.h>

FIR :: FIR(int theLength) : Object()
{
  length = theLength;
  coeffs = (MY_FLOAT *) malloc(length * sizeof(MY_FLOAT));
  pastInputs = (MY_FLOAT *) calloc(2*length, sizeof(MY_FLOAT));
  piOffset = length;
  strcpy(name,"FIR Filter");
}

FIR :: FIR(const char *filterFile) : Object()
{
  FILE *fp;
  float d;
  int rtn,i;
  strncpy(name,filterFile,strlen(name));
  fp = fopen(filterFile,"r");
  if (!fp)   {
    char nfn[1000];
    // char nfn[strlen(FILTER_DIR) + strlen(filterFile) + 1];
    strcpy(nfn,FILTER_DIR);
    strcat(nfn,filterFile);
    printf("Couldn't find soundfile %s. Trying %s\n",filterFile,nfn);
    fp = fopen(nfn,"r");
    if (!fp)   {
      printf("Couldn't find filterfile %s or %s!\n",filterFile,nfn);
      exit(-1);
    }
  }
  rtn = fscanf(fp,"%f",&d);
  if (rtn == EOF)
    goto error;
  delay = (MY_FLOAT) d;
  rtn = fscanf(fp,"%f",&d);
  if (rtn == EOF)
    goto error;
  length = (int)d;
  coeffs = (MY_FLOAT *) malloc(length * sizeof(MY_FLOAT));
  pastInputs = (MY_FLOAT *) calloc(2*length, sizeof(MY_FLOAT));
  for (i=0;i<length;i++) {
    rtn = fscanf(fp,"%f",&d);
    if (rtn == EOF)
      goto error;
    coeffs[i] = (MY_FLOAT)d;
  }
  piOffset = length;
  return;
error: 
  fprintf(stderr,"Premature EOF or bad numbers in filter file %s\n",
          filterFile);
  exit(-1);
}

FIR :: ~FIR()
{
  free(pastInputs);
  free(coeffs);
}

void FIR :: clear()
{
  int i;
  for (i=0; i < 2*length; i++) {
    pastInputs[i] = 0;
  }
  piOffset = length;
}

void FIR :: setCoeffs(MY_FLOAT *theCoeffs)
{
  int i;
  for (i=0; i < length; i++) {
    coeffs[i] = theCoeffs[i];
  }
}

MY_FLOAT FIR :: tick(MY_FLOAT input) {
  int i;
  lastOutput = input*coeffs[0];
  for (i=1; i<length; i++)
    lastOutput += coeffs[i] * pastInputs[piOffset-i]; 
    // sample 0 unused
  pastInputs[piOffset++] = input;
  if (piOffset >= 2*length) { // sample 2*length-1 unused
    piOffset = length;
    for (i=0; i<length; i++)
      pastInputs[i] = pastInputs[length+i];
  }
  return lastOutput;
}


MY_FLOAT FIR :: getDelay(MY_FLOAT freq)
{
  return delay;
}

int FIR :: getLength(void)
{
  return length;
}

char * FIR :: getName(void)
{
  return name;
}

void FIR :: setName(char *theName)
{
  strncpy(name,theName,strlen(name));
}

⌨️ 快捷键说明

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