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; }
// 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); }
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); }