コイルとオペアンプを使用すると、有名な回路などの非常に興味深い回路を作成できます。 周波数フィルター。 これらのフィルターは、エレクトロニクス業界で多数の用途があります。 ローパスフィルター、ハイパスフィルターなどと同様です。 それらは特定のサウンドアプリケーションにとって特に興味深いものであり、ノイズ、または周波数に応じて多かれ少なかれ深刻なサウンドをフィルタリングすることができます。 したがって、それらは非常に便利です。
あなたがもっと知りたいなら ローパスフィルタ、およびその他のフィルター、およびそれらがArduinoまたはDIYを使用したプロジェクトでどのように役立つかについては、読み続けることをお勧めします...
電気フィルター
その名前が示すように、フィルターは、一連のコイルとコンデンサー、さらにはいくつかのオペアンプで構成された回路であり、 周波数の特定の部分のみを通過させる。 つまり、利用可能な周波数の全スペクトルのうち、XNUMXつまたは複数の部分をフィルタリングして通過を防ぎます。
の場合 ejemplo 私たちは、20Hzから20Khzまでの人間が聞くことができるスペクトルについて話しています。フィルターを使用すると、多かれ少なかれ高音/低音のみを通過させるために、最低または最高を排除できます。 これは、マイクやスピーカーなど、多くのオーディオ録音または再生システムで使用されているものです。
種類
従った フィルタータイプ、またはむしろ、それらがブロックする周波数またはそれらが通過する周波数に応じて、次のようなさまざまなタイプの回路があります。
- ローパスフィルタ:これらは、最低周波数を通過させ、高周波数の通過を抑制または低減するフィルターであるため、このように呼ばれます。 これらは、XNUMXつ以上のコイル(電源と負荷と直列)、および電源と負荷を備えたXNUMXつまたはXNUMXつのシャントコンデンサで構成されます。 負荷はフィルターに接続され、フィルターの出力を収集するデバイスであると理解されていることを忘れないでください...これらのフィルター内には、L、T、 π.
- ハイパスフィルタ:ハイパスフィルターはローパスの反対です。この場合、フィルター処理または制限するのは低周波数パスであり、高周波数を通過させます。 これには、それを構成する電子要素が投資されています。 つまり、ここでは、コンデンサは電源と負荷に直列に接続され、コイルはシャントされます。 ローパスフィルターの場合と同じサブタイプもあります。
- バンドパスフィルター:このタイプのフィルターは、XNUMXつの周波数帯域通過率ブロックを実行します。 つまり、これらはローパスフィルターとハイパスフィルターの両方として機能し、最低周波数と最高周波数の通過に対抗します。 言い換えれば、それは中間周波数のみを通過させます。
- バンドフィルター:前の周波数とは正反対です。中間周波数の通過をフィルタリングし、最低周波数と最高周波数のみを通過させます。
それを覚えておいてください インダクタンス 彼らは低周波数を通過させ、高周波数の通過に反対します。 代わりに、 コンデンサー 彼らは高周波数を通過させ、低周波数の通過に反対します。
そのフィルターを実用的なレベルで追加したいと思います 彼らは完璧ではありません、そして彼らはあなたがブロックすべきいくつかの低周波数または高周波数を常に通過させることができます。 ただし、ほとんどのアプリケーションで非常にうまく機能します。
そして最後に、もう一つ明確にしておきたいことですが、それはあなたが確かに聞いたことがあるということです EMAおよびDEMAフィルター。 EMA(指数移動平均)フィルターを使用すると、このタイプのフィルターを組み込みデバイスに簡単に実装できます。 DEMA(Double Exponential Moving Average)に関しては、EMAよりも応答が速く、回避したいノイズを適切に抑制します。
アルファファクター
El アルファファクター次のセクションのArduinoIDEコードに表示される、は、指数フィルターの動作を条件付けるパラメーターです。 これは、カットオフ周波数に関連しています。
- Alpha = 1:フィルタリングされていない出力に信号を提供します。
- Alpha = 0:フィルター値は常に0になります。
- Alpha = x:他の値はEMAフィルターで他の変更を取得できます。 アルファ係数を小さくすると、得られる周波数信号が柔らかくなり、システムの応答時間も長くなります(安定するまでに時間がかかります)。
フィルタとArduino
回路を作成する必要がないことを知っておく必要があります ハイパスフィルターまたはローパスフィルター Arduinoボードに接続して操作します。 これらの種類の単純なフィルターを実験して作成することはできますが、ArduinoボードとArduinoIDEの単純なコードだけでEMAがどのように機能するかをテストすることもできます。 一部の周波数のフィルタリングをどのように担当しているかを確認する必要があるのはこれだけです(この場合、アクションがシミュレートされ、一部の整数/浮動小数点数が単純にフィルタリングされます) 私がすることをシミュレートする 実際にフィルターします)。
練習に使用できるコードサンプルを次に示します。
タイプの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); }
これらのコードを変更して実験することをお勧めします。 あなたができる結果 非常にグラフィカルに見る ArduinoIDEのシリアルプロッタに感謝します... ArduinoプログラミングやIDEの使用方法について質問がある場合は、 PDF形式の無料HwLibreコース.