سلام. من میخوام کد یه کنترل کننده صوت رو بنویسم. یه کد PWM دارم که روی برد UNO اجرا میشه و صوت ورودی رو میگیره و پخش میکنه :
کد:
// ADC to PWM converter // takes in audio data from the ADC and plays it out on // Timer1 PWM. 16b, Phase Correct, 31.25kHz - although ADC is 10b. #include <FIR.h> #define PWM_FREQ 0x00fF // pwm frequency - see table #define PWM_MODE 0 // Fast (1) or Phase Correct (0) #define PWM_QTY 2 // number of pwms, either 1 or 2 const int buttonPin = 2; int buttonState =0; int counter=0; FIR LPF; void setup() { // setup ADC ADMUX = 0x60; // left adjust, adc0, internal vcc ADCSRA = 0xe5; // turn on adc, ck/32, auto trigger ADCSRB =0x07; // t1 capture for trigger DIDR0 = 0x01; // turn off digital inputs for adc0 // setup PWM TCCR1A = (((PWM_QTY - 1) << 5) | 0x80 | (PWM_MODE << 1)); // TCCR1B = ((PWM_MODE << 3) | 0x11); // ck/1 TIMSK1 = 0x20; // interrupt on capture interrupt ICR1H = (PWM_FREQ >> 8); ICR1L = (PWM_FREQ & 0xff); DDRB |= ((PWM_QTY << 1) | 0x02); // turn on outputs sei(); // turn on interrupts - not really necessary with arduino } void loop() { while(1); // gets rid of jitter } ISR(TIMER1_CAPT_vect) { // get ADC data unsigned int temp1 = ADCL; unsigned int temp2 = ADCH; // output high byte on OC1A OCR1AH = temp2 >> 8; // takes top 8 bits OCR1AL = temp2; // takes bottom 8 bits // output low byte on OC1B OCR1BH = temp1 >> 8; OCR1BL = temp1; }
حالا میخوام برای فیلتر کردنش و گرفتن فرکانسای پایین و بالا و خروجی گرفتن از فیلتر FIR استفاده کنم که کدش رو توی این کتابخونه پیدا کردم . فقط چون من تجربه ای تو کار کردن با فیلترها و آردوینو ندارم و دفعه اولمه یه مقدار گیر کردم توش و نمیدونم چجوری میشه از این فیلتر استفاده کرد چون باید توی کد ISR ای که توی PWM هست اون مقداری که توی ADCL , ADCH هست رو در قالب یه ورودی یه بار یه فیلتر پایین گذر و یه بار به فیلتر بالا گذر با فرکانس قطع 2KHz بدم و خروجی و نتیجه فیلتر شده رو بتونه پخش کنه. من نمیدونم coefficientها و order و تعداد بیت های خروجی فیلتر رو چقدر باید انتخاب کنم و چجوری از این فیلتر استفاده کنم. ممنون میشم من رو راهنمایی کنید.