저역 통과 필터 :이 회로에 대해 알아야 할 모든 것

저역 통과 필터 회로

코일과 연산 증폭기를 사용하면 유명한 회로와 같이 매우 흥미로운 회로를 만들 수 있습니다. 주파수 필터. 이 필터는 전자 산업에서 다양한 용도로 사용됩니다. 저역 통과 필터, 고역 통과 필터 등의 경우와 같습니다. 특정 사운드 응용 프로그램에 특히 흥미롭고, 주파수에 따라 노이즈 또는 다소 심각한 사운드를 필터링 할 수 있습니다. 따라서 매우 유용합니다.

더 알고 싶다면 저역 통과 필터, 기타 필터, Arduino 또는 DIY로 프로젝트에서 어떻게 도움이 될 수 있는지에 대해 계속 읽어 보시기 바랍니다.

전기 필터

이름에서 알 수 있듯이 필터는 일련의 코일과 커패시터, 심지어 일부 연산 증폭기로 구성된 회로입니다. 주파수의 특정 부분 만 통과. 즉, 사용 가능한 주파수의 전체 스펙트럼 중에서 하나 이상의 부품을 필터링하여 통과하지 못하도록합니다.

경우 ejemplo 우리는 20Hz에서 20Khz까지 인간이들을 수있는 스펙트럼에 대해 이야기하고 있습니다. 필터를 사용하여 필터를 사용하여 더 많거나 적은 고음 / 저음 만 통과하도록 허용하기 위해 가장 낮은 또는 가장 높은 필터를 제거 할 수 있습니다. 마이크, 스피커 등과 같은 많은 오디오 녹음 또는 재생 시스템에서 사용하는 것입니다.

유형

에 따르면 필터 유형또는 오히려 차단하는 주파수 또는 통과하는 주파수에 따라 다음과 같은 다양한 유형의 회로가 있습니다.

  • 저역 통과 필터: 그들은 가장 낮은 주파수를 통과시키고 더 높은 주파수의 통과를 억제하거나 감소시키는 필터이기 때문에 그렇게 불립니다. 하나 이상의 코일 (전원 공급 장치 및 부하와 직렬로 연결됨)과 전원 공급 장치 및 부하가있는 하나 또는 두 개의 션트 커패시터로 구성됩니다. 부하는 필터에 연결된 장치로 이해되고 필터의 출력을 수집하는 것으로 이해됩니다. 이러한 필터에는 L, T 및 π.
  • 하이 패스 필터: 고역 통과 필터는 저역 통과의 반대입니다.이 경우 필터링하거나 제한하는 것은 저주파 통과이므로 더 높은 주파수를 통과시킵니다. 여기에 그것을 구성하는 전자 요소가 투자됩니다. 즉, 여기서 커패시터는 전원 공급 장치 및 부하와 직렬로 연결된 커패시터가되고 코일은 션트됩니다. 저역 통과 필터의 경우와 동일한 하위 유형도 있습니다.
  • 대역 통과 필터:이 유형의 필터는 두 개의 주파수 대역 통과율 블록을 사용합니다. 즉, 저역 통과 필터와 고역 통과 필터 역할을 모두 수행하여 동시에 가장 낮은 주파수와 가장 높은 주파수의 통과에 반대합니다. 즉, 중간 주파수 만 통과 할 수 있습니다.
  • 밴드 필터: 그것은 이전의 것과 정확히 반대입니다. 그것은 중간 주파수의 통과를 필터링하고 가장 낮은 주파수와 가장 높은 주파수 만 통과시키는 것입니다.

기억해 인덕턴스 그들은 낮은 주파수를 통과시키고 높은 주파수의 통과에 반대합니다. 대신 커패시터 그들은 고주파를 통과시키고 저주파의 통과에 반대합니다.

실용적인 수준에서 필터를 추가하고 싶습니다. 그들은 완벽하지 않다, 그리고 그들은 항상 차단해야하는 일부 저주파 또는 고주파수를 통과시킬 수 있습니다. 그러나 대부분의 응용 프로그램에서 작업을 잘 수행합니다.

그리고 마지막으로, 또 다른 한 가지를 명확히하고 싶습니다. EMA 및 DEMA 필터. EMA (Exponential Moving Average) 필터를 사용하면 임베디드 장치에서 이러한 유형의 필터를 간단한 방식으로 구현할 수 있습니다. DEMA (Double Exponential Moving Average)의 경우 EMA보다 응답이 빠르므로 피하고 싶은 노이즈를 잘 억제합니다.

알파 인자

El 알파 인자다음 섹션의 Arduino IDE 코드에 표시되는은 지수 필터의 동작을 결정하는 매개 변수입니다. 차단 주파수와 관련이 있습니다.

  • Alpha = 1 : 필터링되지 않은 출력에 신호를 제공합니다.
  • Alpha = 0 : 필터 값은 항상 0입니다.
  • Alpha = x : 다른 값은 EMA 필터에서 다른 변경을 가져올 수 있습니다. 알파 팩터를 줄이면 더 많이 얻은 주파수 신호가 부드러워지고 시스템의 응답 시간도 증가합니다 (안정화하는 데 더 오래 걸립니다).

필터 및 Arduino

Arduino I2C 버스

이러한 필터를 사용하려면 Arduino IDE 용 라이브러리를 사용하면 작업이 훨씬 쉬워집니다. 당신이 사용할 수있는 이 같은.

회로를 만들 필요가 없다는 것을 알아야합니다. 고역 통과 필터 또는 저역 통과 필터 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);                                
}

ADC는 Arduino 아날로그 디지털 변환기라는 것을 기억하십시오. 0 ~ 5 범위로 나누어 0 ~ 1023v 범위를 사용합니다. 값이 0v이면 디지털 값 0을 취하고 5v이면 1023을 신호 값으로 취하고 1v는 204m, 2v는 408 등이됩니다.

이 코드를 수정하고 실험하는 것이 좋습니다. 당신이 할 수있는 결과 매우 그래픽으로 본다 Arduino IDE의 직렬 플로터 덕분에 ... Arduino 프로그래밍 또는 IDE 사용 방법에 대한 질문이있는 경우 다음을 다운로드 할 수 있습니다. PDF로 된 무료 HwLibre 과정.


코멘트를 첫번째로 올려

코멘트를 남겨주세요

귀하의 이메일 주소는 공개되지 않습니다. 필수 필드가 표시되어 있습니다 *

*

*

  1. 데이터 책임자 : Miguel Ángel Gatón
  2. 데이터의 목적 : 스팸 제어, 댓글 관리.
  3. 합법성 : 귀하의 동의
  4. 데이터 전달 : 법적 의무에 의한 경우를 제외하고 데이터는 제 XNUMX 자에게 전달되지 않습니다.
  5. 데이터 저장소 : Occentus Networks (EU)에서 호스팅하는 데이터베이스
  6. 권리 : 귀하는 언제든지 귀하의 정보를 제한, 복구 및 삭제할 수 있습니다.