This Message Is From an External Sender
This message came from outside your organization.
-------- Original Message -------- From: Pablo Frank <[email protected]> Sent: Tue Nov 12 13:29:11 GMT 2024 To: [email protected] Subject: Re: [MUSIC-DSP] feedforward filter 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]> on behalf of Stefano D'Angelo <[email protected]> Sent: Tuesday, November 12, 2024 6:29 AM To: [email protected] <[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
