-------- Original Message -------- From: Pablo Frank <frank_pablo@ hotmail. com> Sent: Wed Nov 13 00: 28: 23 GMT 2024 To: music-dsp@ lists. columbia. edu Subject: Re: [MUSIC-DSP] feedforward filter First of all THANKS !!!! I did what you wrote
ZjQcmQRYFpfptBannerStart
This Message Is From an External Sender
This message came from outside your organization.
 
ZjQcmQRYFpfptBannerEnd


-------- Original Message --------
From: Pablo Frank <[email protected]>
Sent: Wed Nov 13 00:28:23 GMT 2024
To: [email protected]
Subject: Re: [MUSIC-DSP] feedforward filter

First of all THANKS !!!!
I did what you wrote and i get a silent .wav file. There is place enough in the outbuf, then i don't know where is the problem. The changes are in line 146:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <sndfile.h>

//This is me on windows:
//g++ -o a oscc_cr_sr_autonomous1-monoed_no_vector4.cpp   libsndfile-1.dll
//a oscc_cr_sr_autonomous1-monoed_no_vector2.wav  0.5 300 10


//g++ oscc_cr_sr_autonomous1.cpp -lsndfile
//# oscillator sndfile.wav amp freq(hz) dur(s)
//./a.out ross_oscc_1.wav 0.5 300 10

///////////////////////////LIBSNDFILE//////////////////////////////
///functions to open, write, and close a sound file.
SNDFILE *soundout_open(char* name, int chans, float sr){
  // initialise the SF_INFO structure
  SF_INFO info;
  info.samplerate = (int) sr;
  info.channels = chans;
  info.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16;
  // open the file
  return sf_open(name, SFM_WRITE, &info);
}

//vector where are written the values
int soundout(SNDFILE *psf_out, float *buffer, int vecsize){
      return (int) sf_writef_float(psf_out, buffer, vecsize);
}

void soundout_close(SNDFILE *psf_out){
  sf_close(psf_out);
}


/////////////////////OSCILLATOR////////////////////////////////////////////////

float oscc(float *output, float amp, float freq, float *table, float *index, /*float phase,*/ int tablength,float sr)
{
  float incr = freq*tablength/sr, frac, fracsq, fracc; // increment
  float pos,a,b,c,d, tmp;

    // cubic interpolation
    frac = *index - (int)*index;
    a = (int) *index > 0 ? table[(int)(*index)-1] : table[tablength-1];
    b = table[(int)(*index)];
    c = table[(int)(*index)+1];
    d = table[(int)(*index)+2];


    fracsq = frac*frac;
    fracc = frac*fracsq;

      //int i;
    *output = amp*(fracc*(d-a)/8 + fracsq*(c-a)/4 + frac*(b-a) + a); //output[i]
    *index += incr;
    while(*index >= tablength) *index -= (tablength);
    while(*index < 0) *index += tablength;
      
      return *output;
}

float feedforward(const float *in, int index, double a0, double a1, int delay){
  if (index >= delay)
    return a0 * in [index] + a1 * in [index - delay];
  else
    return a0 * in [index];
}

////////////////////////////////TABLE /////////////////////////////////////
const double pi = 4*atan(1.);
float* sinus_table(int length, float phase){

  float *table = new float[length+2];
  phase *= (float)pi*2;
  for(int n=0; n < length+2; n++)
    table[n] = (float) cos(phase+n*2*pi/length);

  return table;
}
float *buzz_table(){
      
      #define BUFFER_SIZE 44100
    float *wtab = new float[BUFFER_SIZE];

    // initialize buffer to zero, since we'll be summing into it
    for (int i=0; i < BUFFER_SIZE; ++i)
        wtab[i] = 0.0f;


    const int num_harmonics = 70; // compute this as needed, highest harmonic
    // must not have period smaller than 2 samples in the buffer.

    // normalize the output amplitude to 1.0...
    double amp_scale = 1.0 / num_harmonics;

    // outer loop: iterate through harmonics from 1 ... num_harmonics
    for (int j=1; j <= num_harmonics; ++j) {
        // inner loop: compute the jth harmonic, sum into buffer
        for (int i=0; i < BUFFER_SIZE; ++i)
            wtab[i] += cos (i * j * (2.0 * pi / (double)BUFFER_SIZE)) * amp_scale;
    }
            
                  return wtab;
            
}

int main(int argc, char** argv){
// NOTE: all of these could be variables instead of #defines
#define CHANS 1
#define SR 44100.0
#define WAVE_SIZE 44100

  SNDFILE *psf;
  float *buffer;
  float *outBuf;
  int bufs;

  float amp, freq, *wave, cs, ndx=0,*wtab;

  if(argc != 5){
    printf("usage: oscillator sndfile.wav amp freq(hz) dur(s)\n");
    return 1;
  }
  amp   = (float) atof(argv[2]);
  freq  = (float) atof(argv[3]);
  bufs  = (int) (atof(argv[4])*SR);

  // allocate buffer & table memory
  buffer = new float[bufs];
  outBuf = new float[bufs];
  wave =   buzz_table();//buzz_table();//sinus_table(WAVE_SIZE, 0.0);

  // now we open the file
  if(!(psf = soundout_open(argv[1], CHANS, SR))){
    printf("error opening output file\n");
    exit(-1);
  }

  double a0 = 0.5, a1 = 0.5;

  for(int i=0; i < bufs; i++){

    oscc(buffer, amp, freq, wave, &ndx, WAVE_SIZE, SR);
      outBuf[i] = feedforward(buffer ,i ,a0 ,a1 ,1);
    soundout(psf,outBuf, 1);
  }

  // close file & free memory
  soundout_close(psf);
  delete[] buffer;
  delete[] outBuf;
  delete[] wave;

  return 0;
}

________________________________
From: music-dsp <[email protected]> on behalf of Nigel Redmon <[email protected]>
Sent: Tuesday, November 12, 2024 9:57 PM
To: [email protected] <[email protected]>
Subject: Re: [MUSIC-DSP] feedforward filter

This:

      //feedforward(const float * in, int index, double a0, double a1, int delay){
      buffer = feedforward(buffer + i, i,a0,a1,1);

Three problems:

feedforward wants a pointer to a float buffer, an index, a couple of coefficients, and a delay amount, and returns a float. I’ve made the text bold for the important points.

1) It returns a float, but you try to stuff it back in the buffer variable, which is a pointer (to a float).

2) You pass it the buffer pointer plus “i”. No, just pass it the float pointer, “buffer".

3) You can’t push the results back into the buffer, in place, because the delay parameter implies that it needs to read the previous float in the buffer. But by that time, you’d have already written over it.

So, at minimum you need a new output buffer, the size of your input buffer, and…

buffer = new float[bufs];
outBuf = new float[bufs];

for (i...
  outBuf[i] = feedforward(buffer, i, a0, a1,1);



On Nov 12, 2024, at 5:29 AM, Pablo Frank <[email protected]> wrote:

I wrote what you said (it's not possible to attach again a file so here below it is the code) and i receive this error:
"oscc_cr_sr_autonomous1-monoed_no_vector4.cpp:144:44: error: cannot convert 'float' to 'float*' in assignment  buffer = feedforward(buffer + i, i,a0,a1,1);"
the 144:44 is the place of the number of samples of the delay, here is simply 1. Don't understand what's wrong."

It is the place of the number 1,  the last place:
buffer = feedforward(buffer + i ,i ,a0 ,a1 ,1 );

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <sndfile.h>

//This is me on windows:
//g++ -o a oscc_cr_sr_autonomous1-monoed_no_vector4.cpp   libsndfile-1.dll
//a oscc_cr_sr_autonomous1-monoed_no_vector2.wav  0.5 300 10


//g++ oscc_cr_sr_autonomous1.cpp -lsndfile
//# oscillator sndfile.wav amp freq(hz) dur(s)
//./a.out ross_oscc_1.wav 0.5 300 10

///////////////////////////LIBSNDFILE//////////////////////////////
///functions to open, write, and close a sound file.
SNDFILE *soundout_open(char* name, int chans, float sr){
  // initialise the SF_INFO structure
  SF_INFO info;
  info.samplerate = (int) sr;
  info.channels = chans;
  info.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16;
  // open the file
  return sf_open(name, SFM_WRITE, &info);
}

//vector where are written the values
int soundout(SNDFILE *psf_out, float *buffer, int vecsize){
      return (int) sf_writef_float(psf_out, buffer, vecsize);
}

void soundout_close(SNDFILE *psf_out){
  sf_close(psf_out);
}


/////////////////////OSCILLATOR////////////////////////////////////////////////

float oscc(float *output, float amp, float freq, float *table, float *index, /*float phase,*/ int tablength,float sr)
{
  float incr = freq*tablength/sr, frac, fracsq, fracc; // increment
  float pos,a,b,c,d, tmp;

    // cubic interpolation
    frac = *index - (int)*index;
    a = (int) *index > 0 ? table[(int)(*index)-1] : table[tablength-1];
    b = table[(int)(*index)];
    c = table[(int)(*index)+1];
    d = table[(int)(*index)+2];


    fracsq = frac*frac;
    fracc = frac*fracsq;

      //int i;
    *output = amp*(fracc*(d-a)/8 + fracsq*(c-a)/4 + frac*(b-a) + a); //output[i]
    *index += incr;
    while(*index >= tablength) *index -= (tablength);
    while(*index < 0) *index += tablength;
      
      return *output;
}

float feedforward(const float * in, int index, double a0, double a1, int delay){
  if (index >= delay)
    return a0 * in [index] + a1 * in [index - delay];
  else
    return a0 * in [index];
}

////////////////////////////////TABLE /////////////////////////////////////
const double pi = 4*atan(1.);
float* sinus_table(int length, float phase){

  float *table = new float[length+2];
  phase *= (float)pi*2;
  for(int n=0; n < length+2; n++)
    table[n] = (float) cos(phase+n*2*pi/length);

  return table;
}
float *buzz_table(){
      
      #define BUFFER_SIZE 44100
    float *wtab = new float[BUFFER_SIZE];

    // initialize buffer to zero, since we'll be summing into it
    for (int i=0; i < BUFFER_SIZE; ++i)
        wtab[i] = 0.0f;


    const int num_harmonics = 50; // compute this as needed, highest harmonic
    // must not have period smaller than 2 samples in the buffer.

    // normalize the output amplitude to 1.0...
    double amp_scale = 1.0 / num_harmonics;

    // outer loop: iterate through harmonics from 1 ... num_harmonics
    for (int j=1; j <= num_harmonics; ++j) {
        // inner loop: compute the jth harmonic, sum into buffer
        for (int i=0; i < BUFFER_SIZE; ++i)
            wtab[i] += cos (i * j * (2.0 * pi / (double)BUFFER_SIZE)) * amp_scale;
    }
            
                  return wtab;
            
}

int main(int argc, char** argv){
// NOTE: all of these could be variables instead of #defines
#define CHANS 1
#define SR 44100.0
#define WAVE_SIZE 44100

  SNDFILE *psf;
  float *buffer;
  int bufs;

  float amp, freq, *wave, cs, ndx=0,*wtab;

  if(argc != 5){
    printf("usage: oscillator sndfile.wav amp freq(hz) dur(s)\n");
    return 1;
  }
  amp   = (float) atof(argv[2]);
  freq  = (float) atof(argv[3]);
  bufs  = (int) (atof(argv[4])*SR);

  // allocate buffer & table memory
  buffer = new float[bufs];
  wave =   buzz_table();//buzz_table();//sinus_table(WAVE_SIZE, 0.0);

  // now we open the file
  if(!(psf = soundout_open(argv[1], CHANS, SR))){
    printf("error opening output file\n");
    exit(-1);
  }

  double a0 = 0.5, a1 = 0.5;
  for(int i=0; i < bufs; i++){

    oscc(buffer, amp, freq, wave, &ndx, WAVE_SIZE, SR);
      //feedforward(const float * in, int index, double a0, double a1, int delay){
      buffer = feedforward(buffer + i, i,a0,a1,1);
    soundout(psf, buffer, 1);
  }

  // close file & free memory
  soundout_close(psf);
  delete[] buffer;
  delete[] wave;

  return 0;
}
________________________________
From: music-dsp <[email protected]<mailto:[email protected]>> on behalf of Stefano D'Angelo <[email protected]<mailto:[email protected]>>
Sent: Tuesday, November 12, 2024 6:29 AM
To: [email protected]<mailto:[email protected]> <[email protected]<mailto:[email protected]>>
Subject: Re: [MUSIC-DSP] feedforward filter

Il 12/11/24 07:23, Stefano D'Angelo ha scritto:
Il 12/11/24 05:28, Pablo Frank ha scritto:
Hi all, in the .cpp file attached there is an oscillator that works ok, and a feedforward filter (line 64) that i don't  know how to insert between the oscillator (line 142) and the soundout function (line 143) to get it working. I'm sure it's a simple programming matter that most of you can solve it immediatelly. Thanks in advance for any help,
Probably something like:

feedforward(&buffer, i, a0, a1, delay);

where a0 and a1 are the filter coefficients and delay is the distance between current input sample and delayed input tap in number of samples.

Sorry, bad copy/paste

buffer = feedforward(buffer + i, i, a0, a1, delay);

However, this will never work and actually crash as buffer is 1 sample wide. You need to either allocate it as

buffer = new float[bufs];

or you need to implement and operate on a circular buffer...

Stefano


Reply via email to