Example #1
0
static RCCResult
run(RCCWorker *self, RCCBoolean timeout, RCCBoolean *newRunCondition) {
  (void)timeout;(void)newRunCondition;
  RCCPort *out = &self->ports[IMPL2_OUT];
  // Impl2Properties* p = ( Impl2Properties* ) self->properties;
  MyState *s = self->memories[0];
  printf("IMPL 2 selected\n");
  double freq=6;
  double gain=100;
  double phase= 0;
  double bias=0;
  double noise=0;
  double interval = (2*PI)/(360/freq);
  unsigned int n;
  uint16_t *data = (uint16_t*)out->current.data;
  for ( n=0; n<out->current.maxLength/2; n++) {
    data[n] = ( gain*sin_wave(interval*n,s) + phase)+ rand()*(noise/50*(gain/20)) + bias;    
  }
  return RCC_ADVANCE;
}
Example #2
0
// class method to play a note based on AnalogOut class
void Buzzer::play(float freq, int dur, float vol) {
    // we create a new array here where each value is scaled by some
    // value. This changes the buzzer's volume.
    for (size_t i = 0; i < numPts; i++)
        analog_data_scaled.at(i) = vol * analog_data.at(i);

    // reset our lut index
    j = 0;

    // setup an interrupt timer that updates the currenly set
    // value at the given duration. This depends on our playing
    // frequency's period and the number of elements in our lookup table.
    RtosTimerHelper sin_wave(this, &Buzzer::analogUpdate, osTimerPeriodic);
    sin_wave.start(1.0 / (freq * numPts));

    // keep the timer interrupt active for however long we
    // need to play this note. Disabling the interrupt once
    // we've waiting long enough
    Thread::wait(dur);
    sin_wave.stop();

    // sets output to mid range - analog zero
    write_u16(32768);
}
Example #3
0
int main(int argc, char **argv) {
    // init args, format :  fft -f file_name num_entries
    //                      fft samples cycles [phase] <- sin, phase in
    //                          increments of pi
    //                      fft -c samples cycles [phase] <- cos
    //                      fft -s samples cycles [phase] <- sqr
    Cnum *input;
    if (argc > 2) {
        int samples = 0;
        if (argv[1][0] == '-') {
            if (!argv[1][1]) goto usage;
            if (argv[1][1] == 'f') {
                if (argc == 4) {
                    sscanf(argv[3], "%d", &samples);
                    input = (Cnum *) malloc(sizeof(Cnum)*samples);
                    input = read_file_in(argv[2]);
                } else goto usage;
            } else {
                double cycles = 0;
                sscanf(argv[2], "%d", &samples);
                sscanf(argv[3], "%lf", &cycles);
                double phase = 0;
                input = (Cnum *) malloc(sizeof(Cnum)*samples);
                if (argc == 5) sscanf(argv[4], "%lf", &phase);
                if (argv[1][1] == 'c') cos_wave(samples, cycles, phase*M_PI, input);
                if (argv[1][1] == 's') sqr_wave(samples, cycles, phase*M_PI, input);
                else goto usage;
            }
        } else {
            if (argc != 3 && argc != 4) goto usage;
            double cycles = 0;
            sscanf(argv[1], "%d", &samples);
            sscanf(argv[2], "%lf", &cycles);
            input = (Cnum *) malloc(sizeof(Cnum)*samples);
            double phase = 0;
            if (argc == 4) sscanf(argv[3], "%lf", &phase);
            sin_wave(samples, cycles, phase*M_PI, input);
        }
        Cnum *output = (Cnum *) malloc(sizeof(Cnum)*samples);
        /*Cnum *dout = (Cnum *) malloc(sizeof(Cnum)*samples);*/

        Cnum *even = (Cnum *) malloc(sizeof(Cnum)*samples/2);
        Cnum *odd  = (Cnum *) malloc(sizeof(Cnum)*samples/2);
        for (int i = 0; i < samples/2; i++) {
            even[i] = input[2*i];
            odd[i]  = input[2*i+1];
        }
        // output = fft(samples, input);
        output = fft_combine(samples, fft(samples/2, even), fft(samples/2, odd));
        Cnum *x;
        printf("Test example for two nodes:\n");
        for (int i = 0; i < samples; i++) {
            /*double y = magn(&output[i])/samples;*/
            x = &output[i];
            printf("%f + %f i\n", x->real, x->imag);
        }
        printf("\n");
        Cnum *even_even = (Cnum *) malloc(sizeof(Cnum)*samples/4);
        Cnum *even_odd  = (Cnum *) malloc(sizeof(Cnum)*samples/4);
        for (int i = 0; i < samples/4; i++) {
            even_even[i] = even[2*i];
            even_odd[i]  = even[2*i+1];
        }
        Cnum *odd_even = (Cnum *) malloc(sizeof(Cnum)*samples/4);
        Cnum *odd_odd  = (Cnum *) malloc(sizeof(Cnum)*samples/4);
        for (int i = 0; i < samples/4; i++) {
            odd_even[i] = odd[2*i];
            odd_odd[i]  = odd[2*i+1];
        }
        printf("Test example for four nodes:\n");
        output = fft_combine(samples, fft_combine(samples/2, fft(samples/4, even_even), fft(samples/4, even_odd)), fft_combine(samples/2, fft(samples/4, odd_even), fft(samples/4, odd_odd)));
        for (int i = 0; i < samples; i++) {
            /*double y = magn(&output[i])/samples;*/
            x = &output[i];
            printf("%f + %f i\n", x->real, x->imag);
        }
        return 0;
    }


    usage:
        free (input);
        puts ("Usage : fft -[cs] samples cycles [phase]");
        puts ("        fft -f file_name samples");
        exit (1);
}