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