سلام. من میخوام کد یه کنترل کننده صوت رو بنویسم. یه کد 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 و تعداد بیت های خروجی فیلتر رو چقدر باید انتخاب کنم و چجوری از این فیلتر استفاده کنم. ممنون میشم من رو راهنمایی کنید.