線圈和運算放大器使您可以創建非常有趣的電路,例如著名的 頻率濾波器。 這些濾波器在電子工業中有許多應用。 與低通濾波器,高通濾波器等一樣。 它們對於某些聲音應用特別有趣,能夠根據其頻率過濾噪聲或多或少的嚴重聲音。 因此,它們非常有用。
如果您想進一步了解 低通濾波器以及其他過濾器,以及它們如何在Arduino或DIY上幫助您的項目中發揮作用,我鼓勵您繼續閱讀...
電動濾清器
顧名思義,濾波器是由一系列線圈和電容器,甚至一些運算放大器組成的電路,其目的是為了 只讓頻率的某些部分通過。 也就是說,在整個可用頻率頻譜中,它們將過濾一個或多個部分以防止它們通過。
如果是 例子 我們正在談論的是人類可聽到的頻譜,從20 Hz到20 Khz,使用濾波器可以消除最低或最高頻譜,以便只允許或多或少的高音/低音通過。 許多音頻記錄或再現系統都使用它,例如麥克風,揚聲器等。
類型
據 過濾器類型或更確切地說,根據它們阻止的頻率或允許通過的頻率,電路的類型有所不同:
- 低通濾波器:之所以這樣稱呼它們是因為它們是那些允許最低頻率通過並抑製或減少較高頻率通過的濾波器。 它們由一個或多個線圈(與電源和負載串聯)和一個或兩個並聯電容器(與電源和負載串聯)組成。 請記住,負載被理解為是連接到濾波器的設備,並且可以收集濾波器的輸出。在這些濾波器中,還存在變體,例如L,T和 π.
- 高通濾波器:高通濾波器與低通相反,在這種情況下,將過濾或限制的是低頻通,讓高頻通過。 在此,構成它的電子元件被投入使用。 也就是說,這裡的電容器將是與電源和負載串聯的電容器,而線圈將被分流。 還有與低通濾波器相同的子類型。
- 帶通濾波器:這種類型的濾波器施加兩個頻帶通過率鎖定。 也就是說,它們既充當低通濾波器又充當高通濾波器,同時阻止最低頻率和最高頻率的通過。 換句話說,它僅允許中頻通過。
- 帶狀濾波器:與上一個恰好相反,它的作用是過濾中頻的通過,只允許最低和最高頻率通過。
記住 電感 他們讓低頻通過,反對高頻通過。 反而, 電容器 他們讓高頻通過,反對低頻通過。
我想在實際水平上添加該過濾器 他們不是完美的,它們總是可以通過您應該阻止的某些低頻或高頻。 但是,它們在大多數應用程序中都能很好地完成工作。
最後,我還要澄清另一件事,那就是您肯定已經聽說過 EMA和DEMA過濾器。 EMA(指數移動平均線)過濾器使您可以在嵌入式設備中以簡單的方式實現這種類型的過濾器。 至於DEMA(雙指數移動平均線),它們的響應比EMA快,從而可以很好地抑制您要避免的噪聲。
阿爾法係數
El 阿爾法因子您將在下一節的Arduino IDE代碼中看到,它是確定指數濾波器行為的參數。 它與截止頻率有關:
- Alpha = 1:向未濾波的輸出提供信號。
- Alpha = 0:過濾器值將始終為0。
- Alpha = x:其他值可以在EMA過濾器中獲得其他更改。 如果減小Alpha係數,則將軟化更多獲得的頻率信號,並且系統的響應時間也會增加(穩定所需的時間更長)。
過濾器和Arduino
您應該知道不必創建電路 高通濾波器或低通濾波器 將其連接到您的Arduino開發板並使用它。 儘管您可以試驗並創建這些簡單的過濾器,但是您也可以測試EMA如何僅與Arduino開發板一起使用以及Arduino IDE的簡單代碼如何工作。 這是您唯一需要查看的功能,它負責過濾某些頻率(在這種情況下,將模擬操作並僅對某些整數/浮點數進行過濾 模擬我會做什麼 實際進行過濾)。
這裡是一些您可以用來練習的代碼示例。
類型的Arduino中的簡單數字濾波器示例 低通:
float lowpass_prev_out[LOWPASS_ANALOG_PIN_AMT], lowpass_cur_out[LOWPASS_ANALOG_PIN_AMT]; int lowpass_input[LOWPASS_ANALOG_PIN_AMT]; int adcsample_and_lowpass(int pin, int sample_rate, int samples, float alpha, char use_previous) { // pin: Pin analógico de Arduino usado // sample_rate: El ratio adecuado // samples: Samples // alpha: El factor Alpha para el filtro paso bajo // use_previous: Si es true se sigue ajustando hasta el valor más reciente. float one_minus_alpha = 1.0-alpha; int micro_delay=max(100, (1000000/sample_rate) - 160); if (!use_previous) { lowpass_input[pin] = analogRead(pin); lowpass_prev_out[pin]=lowpass_input[pin]; } int i; for (i=samples;i>0;i--) { delayMicroseconds(micro_delay); lowpass_input[pin] = analogRead(pin); lowpass_cur_out[pin] = alpha*lowpass_input[pin] + one_minus_alpha*lowpass_prev_out[pin]; lowpass_prev_out[pin]=lowpass_cur_out[pin]; } return lowpass_cur_out[pin]; } int resulting_value; void setup() { Serial.begin(9600); resulting_value = adcsample_and_lowpass(0, 1000, 300, 0.015, false); } void loop() { resulting_value = adcsample_and_lowpass(0, 1000, 150, 0.015, true); Serial.println(resulting_value);
Arduino類型的代碼示例 高通:
int sensorPin = 0; //pin usado para el ADC int sensorValue = 0; //Inicia sensor variable equivalente a EMA Y float EMA_a = 0.3; //Inicialización del EMA Alpha int EMA_S = 0; //Iniciación del EMA s int highpass = 0; void setup(){ Serial.begin(115200); EMA_S = analogRead(sensorPin); } void loop(){ sensorValue = analogRead(sensorPin); //Lee el valor del sensor ADC EMA_S = (EMA_a*sensorValue) + ((1-EMA_a)*EMA_S); //Ejecuta el filtro EMA highpass = sensorValue - EMA_S; //Calcula la seña alta Serial.println(highpass); delay(20); //Espera 20ms }
Arduino代碼示例 帶通:
int sensorPin = 0; //Pin para el ADC int sensorValue = 0; //Inicia la variable del sensor, equivale a EMA Y float EMA_a_low = 0.3; //Inicia EMA Alpha float EMA_a_high = 0.5; int EMA_S_low = 0; //Inicia EMA S int EMA_S_high = 0; int highpass = 0; int bandpass = 0; void setup(){ Serial.begin(115200); EMA_S_low = analogRead(sensorPin); EMA_S_high = analogRead(sensorPin); } void loop(){ sensorValue = analogRead(sensorPin); //Lee el valor del sensor ADC EMA_S_low = (EMA_a_low*sensorValue) + ((1-EMA_a_low)*EMA_S_low); //Ejecuta EMA EMA_S_high = (EMA_a_high*sensorValue) + ((1-EMA_a_high)*EMA_S_high); highpass = sensorValue - EMA_S_low; bandpass = EMA_S_high - EMA_S_low; Serial.print(highpass); Serial.print(" "); Serial.println(bandpass); delay(20); }
Arduino代碼示例 樂隊:
int sensorPin = 0; //Pin usado para el ADC int sensorValue = 0; //Inicio para EMA Y float EMA_a_low = 0.05; //Inicio de EMA alpha float EMA_a_high = 0.4; int EMA_S_low = 0; //Inicia EMA S int EMA_S_high = 0; int highpass = 0; int bandpass = 0; int bandstop = 0; void setup(){ Serial.begin(115200); EMA_S_low = analogRead(sensorPin); EMA_S_high = analogRead(sensorPin); } void loop(){ sensorValue = analogRead(sensorPin); //Lee el valor del sensor ADC EMA_S_low = (EMA_a_low*sensorValue) + ((1-EMA_a_low)*EMA_S_low); //Ejecuta EMA EMA_S_high = (EMA_a_high*sensorValue) + ((1-EMA_a_high)*EMA_S_high); bandpass = EMA_S_high - EMA_S_low; bandstop = sensorValue - bandpass; Serial.print(sensorValue); Serial.print(" "); Serial.print(EMA_S_low); Serial.print(" "); Serial.println(bandstop); delay(20); }
我建議您修改並嘗試使用這些代碼。 您可以得到的結果 以圖形方式看到 感謝Arduino IDE的串行繪圖儀...請記住,如果您對Arduino編程或如何使用IDE有疑問,可以下載 免費的HwLibre PDF課程.