Lav plugin for passfilter

Kst sørger for deklarationsfiler for at forenkle implementeringen af plugin med passfilter. Brugen af deklarationsfilerne beskrives nedenfor.

Deklarationsfiler

Deklarationsfilen for passfiltret er i kst/plugins/pass_filters i kildekodearkivet for Kst. Filen hedder filters.h. For at bruge filen, inkluderes den i dit plugins kildekode:

#include <../filters.h>
(pr konvention placerer vi kildekoden for pluginnet et mappeniveau under stedet hvor deklarationsfilerne er).

Nødvendige funktioner

Deklarationsfilen filters.h indeholder en enkelt funktion som beregner Fouriertransformationen for en funktion der sørges for, anvender det filter der er sørget for på Fouriertransformationen og derefter beregner den inverse Fouriertransformation for den filtrerede transformen. For at sørge for filtret, skal følgende funktion implementeres i dit plugins kildekode:

double filter_calculate( double dFreqValue, const double inScalars[] )

Funktionen skal beregne filtreret amplitude for frekvensen dFreqValue. inScalars[] indeholder de uændrede inddataskalarer for pluginnet, som angives i XML-filen. Sandsynligvis indeholder inScalars[] afskæringsfrekvenser eller andre egenskaber for filtret. For eksempel for at implementere et Butterworth højpassfilter, kan funktionen filter_calculate implementeres som følger:

double filter_calculate( double dFreqValue, const double inScalars[] ) {
  double dValue;
  if( dFreqValue > 0.0 ) {
    dValue = 1.0 / ( 1.0 +
                    pow( inScalars[1] / dFreqValue, 2.0 * (double)inScalars[0] ) );
  } else {
    dValue = 0.0;
  }
  return dValue;
}

Kald filterfunktionen

Så snart den nødvendige filter_calculate er implementeret, kan filterfunktionen fra deklarationsfilen kaldes:

kst_pass_filter( inArrays, inArrayLens, inScalars, outArrays, outArrayLens, outScalars );

Argumenterne som sendes til den eksporterede C-funktion kan sædvanligvis sendes til kst_pass_filter uden ændringer. Der er dog nogle begrænsninger for argumenterne:

  • inArrays[0] skal indeholde feltet med data der skal filtreres.

  • inScalars skal indeholde filterspecifikke parametre som skal bruges af funktionen filter_calculate.

Efter funktionskaldet kommer outArrays[0] til at indeholde det filtrerede datafelt, og outArrayLens vil blive sat passende. Funktionen kst_pass_filter bruger ikke outScalars.

Eksempel

Det følgende er et eksempel på et plugin med et passfilter som implementerer Butterworth højpassfiltrering.

/*
 *  Butterworth low pass filter plugin for KST.
 *  Copyright 2004, The University of British Columbia
 *  Released under the terms of the GPL.
 */

#include <stdlib.h>
#include <math.h>
#include "../filters.h"

extern "C" int butterworth_highpass(const double *const inArrays[], const int inArrayLens[],
                const double inScalars[],
                double *outArrays[], int outArrayLens[],
                double outScalars[]);

int butterworth_highpass(const double *const inArrays[], const int inArrayLens[],
                const double inScalars[],
                double *outArrays[], int outArrayLens[],
                double outScalars[])
{
  int iReturn;

  iReturn = kst_pass_filter( inArrays,
                             inArrayLens,
                             inScalars,
                             outArrays,
                             outArrayLens,
                             outScalars );

  return iReturn;
}

double filter_calculate( double dFreqValue, const double inScalars[] ) {
  double dValue;

  if( dFreqValue > 0.0 ) {
    dValue = 1.0 / ( 1.0 + pow( inScalars[1] / dFreqValue, 2.0 * (double)inScalars[0] ) );
  } else {
    dValue = 0.0;
  }

  return dValue;
}