Search code examples
c++arduinofft

is there a way to set an "unknown" variable like "x" inside a sine-equation, and change its value afterwards?


I want to write an audio code in c++ for my microcontroller-based synthesizer which should allow me to generate a sampled square wave signal using the Fourier Series equation.

My question in general is: is there a way to set an "unknown" variable like "x" inside a sine-equation, and change its value afterwards?

What do I mean by that: If you take a look on my code i've written so far you see the following:

void SquareWave(int mHarmonics){
    char x;
    for(int k = 0; k <= mHarmonics; k++){
      mFourier += 1/((2*k)+1)*sin(((2*k)+1)*2*M_PI*x/SAMPLES_TOTAL);
    }
    for(x = (int)0; x < SAMPLES_TOTAL; x++){
      mWave[x] = mFourier;   
    } 
  } 

Inside the first for loop mFourier is summing weighted sinus-signals dependent by the number of Harmonics "mHarmonics". So a note on my keyboard should be setting up the harmonic spectrum automatically. In this equation I've set x as a character and now we get to the center of my problem because i want to set x as a "unknown" variable which has a value that i want to set afterwards and if x would be an integer it would have some standard value like 0, which would make the whole equation incorrect.

In the bottom loop i want to write this Fourier Series sum inside an array mWave, which will be the resulting output. Is there a possibility to give the sum to mWave[x], where x is a "unknown" multiplier inside the sine signal first, and then change its values afterwards inside the second loop?

Sorry if this is a stupid question, I have not much experience with c++ but I try to learn it by making these stupid mistakes!

Cheers


Solution

  • So since I can't use vectors inside Arduino IDE anyhow I've tried the following solution:

    ...
    
    void ComputeBandlimitedSquareWave(int mHarmonics){
        for(int i = 0; i < sample_count; i++){
          mWavetable[i] = ComputeFourierSeriesSquare(x);    
          if (x < sample_count) x++;
         }
      }
    
      float ComputeFourierSeriesSquare(int x){
        for(int k = 0; k <= mHarmonics; k++){
             mFourier += 1/((2*k)+1)*sin(((2*k)+1)*2*M_PI*x/sample_count);
             return mFourier;
          }
      }
    
    ...
    
    

    First I thought this must be right a minute ago, but my monitors prove me wrong... It sounds like a completely messed up sum of signals first, but after about 2 seconds the true characterisic squarewave sound comes through. I try to figure out what I'm overseeing and keep You guys updated if I can isolate that last part coming through my speakers, because it actually has a really decent sound. Only the messy overlays in the beginning are making me desperate right now...