线圈和运算放大器使您可以创建非常有趣的电路,例如著名的 频率滤波器。 这些滤波器在电子工业中有许多应用。 与低通滤波器,高通滤波器等一样。 它们对于某些声音应用特别有趣,能够根据其频率过滤噪声或多或少的严重声音。 因此,它们非常有用。
如果您想进一步了解 低通滤波器以及其他过滤器,以及它们如何在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课程.