手把手教系列之IIR数字滤波器设计实现

嵌入式ARM 2020-03-30 00:00
【导读】:在嵌入式系统中经常需要采集模拟信号,采集模拟信号的信号链中难免引入干扰,那么如何滤除干扰呢?今天就来个一步一步描述如何设计部署一个IIR滤波器到你的系统。写这篇文章考虑到很多粉丝是做单片机系统开发的,经常会需要采集模拟信号,系统中往往存在各种各样的干扰,干扰常常让人一筹莫展,所以花了一周时间整理出IIR滤波器设计部署的干货文章,照此一步一步做,你必会解决大部分干扰问题。

编外语: 文章写作过程虽谈不上呕心沥血,但也可算绞尽脑汁。 在此也呼吁粉丝朋友积极参与互动,或点在看,或分享,或留言评论,当然如能买杯咖啡,那就更好啦!如果大家对此类话题感兴趣,我会写出系列信号处理文章以答谢各位的厚爱,如果大家对此类话题不感兴趣,就不在花过多时间整理发布了。在此感谢各位关注厚爱!

何为IIR滤波器?

无限冲激响应(IIRInfinite Impulse Response)是一种适用于许多线性时不变系统的属性,这些系统的特征是具有一个冲激响应h(t),该冲激响应h(t)不会在特定点上完全变为零,而是无限期地持续。这与有限冲激响应(FIRFinite Impulse Response)系统形成对比,在有限冲激响应(FIR)系统中,对于某个有限T,在时间t> T时,冲激响应确实恰好变为零。线性时不变系统的常见示例是大多数电子和数字滤波器。具有此属性的系统称为IIR系统或IIR滤波器。对于什么叫冲激响应,这里就不展开解释了,有兴趣的可以查阅相关书籍。

这是常见的教科书式数学严谨定义,很多人看到这一下就蒙了,能说人话吗?

线性时不变系统理论俗称LTI系统理论,源自应用数学,直接在核磁共振频谱学、地震学、电路、信号处理和控制理论等技术领域运用。它研究的是线性、非时变系统对任意输入信号的响应。虽然这些系统的轨迹通常会随时间变化(例如声学波形)来测量和跟踪,但是应用到图像处理和场论时,LTI系统在空间维度上也有轨迹。因此,这些系统也被称为线性非时变平移,在最一般的范围理论给出此理论。在离散(即采样)系统中对应的术语是线性非时变平移系统。由电阻、电容、电感组成的电路是LTI系统的一个很好的例子。比如一个运放系统在一定频带范围内满足信号的时域叠加,输入一个100Hz和200Hz正弦信号,输出频率是这两种信号的线性叠加。

用数学对LTI系统描述:

线性:输入x1(t),产生响应 y1(t),而输入x2(t),产生相应y2(t) , 那么放缩和加和输入 ax1(t)+bx1(t), 产生放缩、加和的响应ay1(t)+by1(t),其中a和b是标量,对于任意的有:

输入  

产生响应为:

时不变性:指如果将系统的输入信号延迟δ秒,那么得到的输出响应也相应延时δ秒。用数学描述,也即如果输入x1(t),产生响应y1(t) ,而输入x1(t+δ) ,产生响应 y1(t+δ)

这么描述还是不易懂,来个图,有图有真相:

假定一个信号放大电路对100Hz正弦信号放大2倍,则输出为:

而对200Hz的正弦信号,假定其放大倍数为1.7倍。(做过运放电路设计的朋友应该有经验,在其同频带其放大倍数往往并不平坦,也即幅频响应在频带内不平坦,这是比较常见的)。也即输入为:

则响应为:


那么如果输入100Hz和200Hz的时域叠加信号,则其输入为:

则其响应为:

由这些图可看出,输入信号的形状保持不变,输出为对应输入的线性时域叠加。对于时不变,就不用图描述了,在一个真实电路中,如果输入延迟一定时间,则响应对应延迟相同时间输出。

上面这么多文字只是为了描述在什么场合可以使用IIR滤波器对信号进行数字滤波。总结而言,就是在线性时不变系统中适用。换言之,在大多数电路系统中我们都可以尝试采用IIR滤波器进行数字滤波。

那么究竟什么是IIR滤波器呢?从数字信号处理的书籍中我们能看到这样的Z变换信号流图:

Z的-1次方表示延迟一拍,在数字系统中表示对于输入信号而言,即为上一次采样值,对于输出而言,即为上一次的输出值。


在时域中对于上述流图,用时域描述即为:

如果熟悉Z变换,则Z变换传递函数为:

上述数字滤波器,如果从编程的角度来看,x(n-1),表示上一次的信号,可能是来自ADC的上次采样,而y(n-1)则为上一次滤波器的输出值,对应就比较好理解x(n-N)就表示前第n次输入样本信号,而y(n-M)则为前第M次滤波器的输出。

说了这么多,只是为了更好的理解概念,只有概念理解正确,才能使用正确。概念理解这对工程师而言,非常之重要。

如何设计呢?

MATLAB提供了非常容易使用的FDATool帮助我们设计数字滤波器,真正精彩的地方开始了,让我们拭目以待究竟如何一步一步设计并实施一个IIR滤波器。首先打开MATLAB,在命令行中敲fdatool,然后敲回车

弹出窗体就是fdatool了,如下:

在设计具体,有几个相关概念需要澄清:
Fs :采 样率,单位为Hz,真实部署在系统中,请务必确保样本是按照恒定采样率进行采样,否则将得不到想要的效果。
Fpass : 通频带,单位为Hz,即系统中期望通过的最高频率。
Fstop : 截至频率,即幅频响应的-3dB处的频率,这个如不理解,请自行查阅相关书籍。
分贝dB : 这是一个无单位反应输出与输入倍数的一个术语。电学中分贝与放大倍数的转换关系为:
  • A(V)(dB)=20lg(Vo/Vi);电压增益,Vo 为输出电压,Vi为输入电压

  • A(I)(dB)=20lg(Io/Ii);电流增益,Io 为输出电流,Ii为输入电流

  • A(p)(dB)=10lg(Po/Pi);功率增益,Po 为输出功率,Pi为输入功率

滤波器类型:这里有Butterworth(巴特沃斯)、Chebyshev Type I,Chebyshev Type II、(切比雪夫)、Elipic 等可选。

  • 巴特沃斯 Butterworth,也被称作最大平坦滤波器。巴特沃斯滤波器的特点是通频带内的频率响应曲线最大限度平坦,没有纹波。

  • 切比雪夫 Chebyshev,是在通带或阻带上频率响应幅度等波纹波动的滤波器。切比雪夫滤波器在过渡带比巴特沃斯滤波器的衰减快,但频率响应的幅频特性不如后者平坦。

  • 椭圆 Elliptic,椭圆滤波器是在通带和阻带等波纹的一种滤波器。

  • …这里就不一一介绍了,有兴趣可以去查信号处理书籍。

就其特点,这里对其中几种略作介绍:

  • 巴特沃斯具有最平坦的通带。

  • 椭圆滤波器衰减最快,但是通带、阻带都有波纹。

  • 切比雪夫滤波器衰减比巴特沃斯快,但比椭圆滤波器慢,波纹区域可选择。

假设我们需要设计一个IIR滤波器,采样率为32000Hz, 有用信号频率在10000Hz内,设计IIR滤波器对信号进行数字滤波。这里为节省算力,我们指定滤波器的阶数,也即传递函数中N/M中的最大值,一般而言N大于M。

这里指定阶数为8阶,类型指定为巴特沃斯型IIR滤波器,输入阶数8阶,采样率32000Hz,然后点击Design Filter如下图所示:

其相频响应曲线如下:


除此之外,我们还可以将幅频与相频曲线放在一个频率坐标上去看设计结果:

导出滤波器参数,这里我们选择,

然后就得到了一个文件,保存2KHz_LPF.fcf,文件名随你喜欢。

文件内容如下:

Generated by MATLAB(R) 8.4 and the Signal Processing Toolbox 6.22.
Generated on: 27-Mar-2020 21:27:06

Coefficient FormatDecimal

Discrete-Time IIR Filter (real)                            
-------------------------------                            
Filter Structure    : Direct-Form IISecond-Order Sections
Number of Sections  : 4                                    
Stable              : Yes                                  
Linear Phase        : No                                   


SOS Matrix:                                                  
1  2  1  1  -1.7193929141691948  0.8610574795347461          
1  2  1  1  -1.5237898734101736  0.64933827386370635         
1  2  1  1  -1.4017399331200424  0.51723237044751591         
1  2  1  1  -1.3435020629061745  0.45419615396638446         

Scale Values:                                                
0.035416141341387819                                         
0.031387100113383172                                         
0.028873109331868367                                         
0.027673522765052503                                          

至此设计工作就结束了,马上进入滤波器的部署测试阶段。

这里有个概念需要略作解释:什么叫直接II型 SOS

所谓直接II型,SOS(second order section)理解很简单,本质是将IIR Z传递函数分解为上述二阶块的级联形式。

部署测试滤波器

到这里,没有经验的朋友可能会说,这么一堆参数我该咋用呢?

需要自己去写前面描述的计算公式吗?当然你也可以这么做,这里就不写了,ARM的CMSIS库已经帮大家设计好了种类繁多的数字信号处理函数实现了,而且经过了测试,这里直接拿来用即可。有兴趣自己写也不难,只要理解Z传递函数概念内涵,非常容易实现。这里我们采用32位浮点实现函数:

arm_biquad_cascade_df1_f32。该函数位于:

CMSIS\DSP\Source\FilteringFunctions\arm_biquad_cascade_df1_init_f32.c

CMSIS\DSP\Source\FilteringFunctions\arm_biquad_cascade_df1_f32.c

我们来看一看这个函数:

arm_biquad_cascade_df1_init_f32.c:

/*
*作用      :初始化滤波器
*S        :指向浮点SOS级联结构的实例。
*numStages:滤波器中二阶SOS的数量
*pCoeffs  :滤波器参数指针,参数按下列顺序存储
*          {b10, b11, b12, a11, a12, b20, b21, b22, a21, a22, ...}
*pState   :历史状态缓冲区指针
*/

void arm_biquad_cascade_df1_init_f32(
        arm_biquad_casd_df1_inst_f32 * S,
        uint8_t numStages,
  const float32_t * pCoeffs,
        float32_t * pState)

{
  /* Assign filter stages */
  S->numStages = numStages;

  /* Assign coefficient pointer */
  S->pCoeffs = pCoeffs;

  /* Clear state buffer and size is always 4 * numStages */
  memset(pState, 0, (4U * (uint32_t) numStages) * sizeof(float32_t));

  /* Assign state pointer */
  S->pState = pState;
}

arm_math.h 定义了须用到的结构体,对于本例相关的结构体为arm_biquad_casd_df1_inst_f32

typedef struct
{

  unsigned int numStages; /*2阶节的个数,应为2*numStages.        */
  float *pState;          /*状态系数数组指针,数组长度为4*numStages*/
  float *pCoeffs;         /*系数数组指针, 数组的长度为5*numStages.*/
} arm_biquad_casd_df1_inst_f32;

滤波器具体滤波函数为:

arm_biquad_cascade_df1_f32

/**
 *  *S       :指向浮点Biquad级联结构的实例.
 *  *pSrc    :指向输入数据块。
 *  *pDst    :指向输出数据块。
 *  blockSize:每次调用要处理的样本数。
 *  返回值    :无.
 */

void arm_biquad_cascade_df1_f32(
  const arm_biquad_casd_df1_inst_f32 * S,
  float * pSrc,
  float * pDst,
  unsigned int blockSize)

{
  float *pIn = pSrc;                         /*源指针     */
  float *pOut = pDst;                        /*目的指针    */
  float *pState = S->pState;                 /*状态指针    */
  float *pCoeffs = S->pCoeffs;               /*参数指针    */
  float acc;                                 /*累加器      */
  float b0, b1, b2, a1, a2;                  /*滤波器参数   */
  float Xn1, Xn2, Yn1, Yn2;                  /*滤波器状态变量*/
  float Xn;                                  /*临时输入     */
  unsigned int sample, stage = S->numStages; /*循环计数     */

  do
  {
    /* Reading the coefficients */
    b0 = *pCoeffs++;
    b1 = *pCoeffs++;
    b2 = *pCoeffs++;
    a1 = *pCoeffs++;
    a2 = *pCoeffs++;

    Xn1 = pState[0];
    Xn2 = pState[1];
    Yn1 = pState[2];
    Yn2 = pState[3];

    sample = blockSize >> 2u;

    while(sample > 0u)
    {
      /* 读第一个输入 */
      Xn = *pIn++;

      /* acc =  b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */
      Yn2 = (b0 * Xn) + (b1 * Xn1) + (b2 * Xn2) + (a1 * Yn1) + (a2 * Yn2);

      /* Store the result in the accumulator in the destination buffer. */
      *pOut++ = Yn2;

      /* 每次计算输出后,状态都应更新. */
      /* 状态应更新为:  */
      /* Xn2 = Xn1    */
      /* Xn1 = Xn     */
      /* Yn2 = Yn1    */
      /* Yn1 = acc   */

      /* Read the second input */
      Xn2 = *pIn++;

      /* acc =  b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */
      Yn1 = (b0 * Xn2) + (b1 * Xn) + (b2 * Xn1) + (a1 * Yn2) + (a2 * Yn1);

      /* 将结果存储在目标缓冲区的累加器中. */
      *pOut++ = Yn1;

      /* 每次计算输出后,状态都应更新. */
      /* 状态应更新为:  */
      /* Xn2 = Xn1    */
      /* Xn1 = Xn     */
      /* Yn2 = Yn1    */
      /* Yn1 = acc   */

      /*读第三个输入 */
      Xn1 = *pIn++;

      /* acc =  b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */
      Yn2 = (b0 * Xn1) + (b1 * Xn2) + (b2 * Xn) + (a1 * Yn1) + (a2 * Yn2);

      /* 将结果存储在目标缓冲区的累加器中. */
      *pOut++ = Yn2;

      /* 每次计算输出后,状态都应更新. */
      /* 状态应更新为: */
      /* Xn2 = Xn1    */
      /* Xn1 = Xn     */
      /* Yn2 = Yn1    */
      /* Yn1 = acc   */
      /* 读第四个输入 */
      Xn = *pIn++;

      /* acc =  b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */
      Yn1 = (b0 * Xn) + (b1 * Xn1) + (b2 * Xn2) + (a1 * Yn2) + (a2 * Yn1);

      /* 将结果存储在目标缓冲区的累加器中. */
      *pOut++ = Yn1;

      /* 每次计算输出后,状态都应更新. */
      /* 状态应更新为:  */
      /* Xn2 = Xn1    */
      /* Xn1 = Xn     */
      /* Yn2 = Yn1    */
      /* Yn1 = acc   */
      Xn2 = Xn1;
      Xn1 = Xn;

      /* 递减循环计数器 */
      sample--;
    }

    /* 如果blockSize不是4的倍数,
    *请在此处计算任何剩余的输出样本。
    *不使用循环展开. */

    sample = blockSize & 0x3u;

    while(sample > 0u)
    {
      /* 读取输入 */
      Xn = *pIn++;

      /* acc =  b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] */
      acc = (b0 * Xn) + (b1 * Xn1) + (b2 * Xn2) + (a1 * Yn1) + (a2 * Yn2);

      /* 将结果存储在目标缓冲区的累加器中. */
      *pOut++ = acc;

      /* 每次计算输出后,状态都应更新。 */
      /* 状态应更新为:    */
      /* Xn2 = Xn1    */
      /* Xn1 = Xn     */
      /* Yn2 = Yn1    */
      /* Yn1 = acc   */
      Xn2 = Xn1;
      Xn1 = Xn;
      Yn2 = Yn1;
      Yn1 = acc;

      /* d递减循环计数器 */
      sample--;
    }

    /*  将更新后的状态变量存储回pState数组中 */
    *pState++ = Xn1;
    *pState++ = Xn2;
    *pState++ = Yn1;
    *pState++ = Yn2;

    /*第一阶段从输入缓冲区到输出缓冲区.     */
    /*随后的numStages在输出缓冲区中就地发生*/
    pIn = pDst;

    /* 重置输出指针 */
    pOut = pDst;

    /* 递减循环计数器 */
    stage--;

  } while(stage > 0u);
}

开始测试:

#include <stdio.h>
#include <math.h>
/*
SOS Matrix:                                                  
1  2  1  1  -1.7193929141691948  0.8610574795347461          
1  2  1  1  -1.5237898734101736  0.64933827386370635         
1  2  1  1  -1.4017399331200424  0.51723237044751591         
1  2  1  1  -1.3435020629061745  0.45419615396638446         

Scale Values:                                                
0.035416141341387819                                         
0.031387100113383172                                         
0.028873109331868367                                         
0.027673522765052503  
做如下转换:
1.缩放
[1  2  1] * 0.035416141341387819
[1  2  1] * 0.031387100113383172
[1  2  1] * 0.028873109331868367
[1  2  1] * 0.027673522765052503
得到:
[0.035416141341387819  2*0.035416141341387819  0.035416141341387819]
[0.031387100113383172  2*0.031387100113383172  0.031387100113383172] 
[0.028873109331868367  2*0.028873109331868367  0.028873109331868367] 
[0.027673522765052503  2*0.027673522765052503  0.027673522765052503]
2.舍掉第四列参数
3.将后两列分别乘以-1,即:
0.035416141341387819  2*0.035416141341387819  0.035416141341387819  -1.7193929141691948  0.8610574795347461          
0.031387100113383172  2*0.031387100113383172  0.031387100113383172  -1.5237898734101736  0.64933827386370635         
0.028873109331868367  2*0.028873109331868367  0.028873109331868367  -1.4017399331200424  0.51723237044751591         
0.027673522765052503  2*0.027673522765052503  0.027673522765052503  -1.3435020629061745  0.45419615396638446 
这样就得到了滤波器系数组了
*/

#define IIR_SECTION 4                /*见前面设计输出为4个SOS块*/
static float iir_state[4*IIR_SECTION];/*历史状态缓冲区         */
const float iir_coeffs[5*IIR_SECTION]={
    
0.035416141341387819,2*0.035416141341387819,0.035416141341387819,1.7193929141691948,-0.8610574795347461,    0.031387100113383172,2*0.031387100113383172,0.031387100113383172,1.5237898734101736,-0.64933827386370635,    0.028873109331868367,2*0.028873109331868367,0.028873109331868367,1.4017399331200424,-0.51723237044751591,    0.027673522765052503,2*0.027673522765052503,0.027673522765052503,1.3435020629061745,-0.45419615396638446
};
static arm_biquad_casd_df1_inst_f32 S;
/*假定采样512个点*/
#define BUF_SIZE 512
#define PI 3.1415926
#define SAMPLE_RATE  32000 /*32000Hz*/
int main()
{
    
float raw[BUF_SIZE];
    
float raw_4k[BUF_SIZE];
    
float raw_out[BUF_SIZE];

    
float raw_noise[BUF_SIZE];
    
float raw_noise_out[BUF_SIZE];

    arm_biquad_casd_df1_inst_f32 S;
    FILE *pFile=fopen(
"./simulation.csv","wt+");
    
if(pFile==NULL)
    {
        
printf("file opened failed");
        
return -1;
    }

    
for(int i=0;i<BUF_SIZE;i++)
    {
/*模拟800Hz正弦幅度171,叠加幅度50随机噪声 */
raw[i] = 
0.5*1024.0/3*sin(2*PI*800*i/32000.0f)+rand()%50;
       raw_4k[i] = 
0.5*1024.0/3*sin(2*PI*4000*i/32000.0f);
       
/*模拟800Hz +4000Hz+随机噪声叠加输入 */
       raw_noise[i] = raw[i] + raw_4k[i];
    }
/*初始化滤波器,以及滤波*/
    arm_biquad_cascade_df1_init_f32(&S, IIR_SECTION, (
float *)&iir_coeffs[0], (float *)&iir_state[0]);
    arm_biquad_cascade_df1_f32(&S, raw, raw_out, BUF_SIZE);

    
for(int i=0;i<BUF_SIZE;i++)
    {
       
fprintf(pFile,"%f,",raw[i]);
    }

    
fprintf(pFile,"\n");
    
for(int i=0;i<BUF_SIZE;i++)
    {
        
fprintf(pFile,"%f,",raw_4k[i]);
    }
    
fprintf(pFile,"\n");
    
for(int i=0;i<BUF_SIZE;i++)
    {
        
fprintf(pFile,"%f,",raw_out[i]);
    }

    
/*初始化滤波器,以及滤波*/
    arm_biquad_cascade_df1_init_f32(&S, IIR_SECTION, (
float *)&iir_coeffs[0], (float *)&iir_state[0]);
    arm_biquad_cascade_df1_f32(&S, raw_noise, raw_noise_out, BUF_SIZE);

    
fprintf(pFile,"\n");
    
for(int i=0;i<BUF_SIZE;i++)
    {
        
fprintf(pFile,"%f,",raw_noise[i]);
    }

    
fprintf(pFile,"\n");
    
for(int i=0;i<BUF_SIZE;i++)
    {
        
fprintf(pFile,"%f,",raw_noise_out[i]);
    }

    fclose(pFile);

    
return 0;
}

利用csv文件,将模拟数据存储,直接用excel打开,将行数据生成曲线图如下:

有兴趣也可以写个界面直接显示,甚至绘制出谱线图,做进一步分析。

  • 第一幅图,为800Hz信号混入随机噪声的波形

  • 第二幅图,为4000Hz信号,对假定系统为无用干扰信号

  • 第三幅图, 为800Hz 混入随机噪声过滤后,已经很好的还原有用信号频率

  • 第四幅图, 为800Hz信号混入随机噪声,同时叠加4000Hz干扰的波形,对系统而言,从时域中,明显可见,有用信号已经完全扭曲

  • 第五幅图,为800Hz信号混入随机噪声,同时叠加4000Hz干扰的输入,经过该低通滤波器后的波形,与第三幅图基本一样,已经非常好的滤除了干扰信号。

总结

  • IIR滤波器在线性时不变系统中可以很好的解决工程中一般噪声问题

  • 如果需要设计带通、高通滤波器其步骤基本类似,只是滤波器的参数以及SOS块个数可能不一样而已

  • 需要提醒的时,IIR的相频响应不线性,如果系统对相频响应有严格要求,就需要采用其他的数字滤波器拓扑形式了

  • 实际应用中,如果阶数不高时,现在算力强劲的单片机或者DSP以及可以直接使用浮点处理。

  • 如果对处理速度有严格的实时要求,需要在极短时间进行滤波处理,可以考虑降低阶数,或采用定点IIR滤波算法实现。也或者将文中函数进行汇编级优化。

最近开的号,没有留言功能,设置了小程序留言功能,欢迎点下面进行留言讨论。

点击留言/查看留言

END


本文授权转载自公众号“嵌入式客栈”,作者:逸珺
嵌入式ARM 关注这个时代最火的嵌入式ARM,你想知道的都在这里。
评论
  • 随着智慧科技的快速发展,智能显示器的生态圈应用变得越来越丰富多元,智能显示器不仅仅是传统的显示设备,透过结合人工智能(AI)和语音助理,它还可以成为家庭、办公室和商业环境中的核心互动接口。提供多元且个性化的服务,如智能家居控制、影音串流拨放、实时信息显示等,极大提升了使用体验。此外,智能家居系统的整合能力也不容小觑,透过智能装置之间的无缝连接,形成了强大的多元应用生态圈。企业也利用智能显示器进行会议展示和多方远程合作,大大提高效率和互动性。Smart Display Ecosystem示意图,作
    百佳泰测试实验室 2025-01-16 15:37 169浏览
  • 80,000人到访的国际大展上,艾迈斯欧司朗有哪些亮点?感未来,光无限。近日,在慕尼黑electronica 2024现场,ams OSRAM通过多款创新DEMO展示,以及数场前瞻洞察分享,全面展示自身融合传感器、发射器及集成电路技术,精准捕捉并呈现环境信息的卓越能力。同时,ams OSRAM通过展会期间与客户、用户等行业人士,以及媒体朋友的深度交流,向业界传达其以光电技术为笔、以创新为墨,书写智能未来的深度思考。electronica 2024electronica 2024构建了一个高度国际
    艾迈斯欧司朗 2025-01-16 20:45 143浏览
  • 数字隔离芯片是现代电气工程师在进行电路设计时所必须考虑的一种电子元件,主要用于保护低压控制电路中敏感电子设备的稳定运行与操作人员的人身安全。其不仅能隔离两个或多个高低压回路之间的电气联系,还能防止漏电流、共模噪声与浪涌等干扰信号的传播,有效增强电路间信号传输的抗干扰能力,同时提升电子系统的电磁兼容性与通信稳定性。容耦隔离芯片的典型应用原理图值得一提的是,在电子电路中引入隔离措施会带来传输延迟、功耗增加、成本增加与尺寸增加等问题,而数字隔离芯片的目标就是尽可能消除这些不利影响,同时满足安全法规的要
    华普微HOPERF 2025-01-15 09:48 182浏览
  • 一个易用且轻量化的UI可以大大提高用户的使用效率和满意度——通过快速启动、直观操作和及时反馈,帮助用户快速上手并高效完成任务;轻量化设计则可以减少资源占用,提升启动和运行速度,增强产品竞争力。LVGL(Light and Versatile Graphics Library)是一个免费开源的图形库,专为嵌入式系统设计。它以轻量级、高效和易于使用而著称,支持多种屏幕分辨率和硬件配置,并提供了丰富的GUI组件,能够帮助开发者轻松构建出美观且功能强大的用户界面。近期,飞凌嵌入式为基于NXP i.MX9
    飞凌嵌入式 2025-01-16 13:15 196浏览
  • 故障现象 一辆2007款法拉利599 GTB车,搭载6.0 L V12自然吸气发动机(图1),累计行驶里程约为6万km。该车因发动机故障灯异常点亮进厂检修。 图1 发动机的布置 故障诊断接车后试车,发动机怠速轻微抖动,发动机故障灯长亮。用故障检测仪检测,发现发动机控制单元(NCM)中存储有故障代码“P0300 多缸失火”“P0309 气缸9失火”“P0307 气缸7失火”,初步判断发动机存在失火故障。考虑到该车使用年数较长,决定先使用虹科Pico汽车示波器进行相对压缩测试,以
    虹科Pico汽车示波器 2025-01-15 17:30 95浏览
  • 近期,智能家居领域Matter标准的制定者,全球最具影响力的科技联盟之一,连接标准联盟(Connectivity Standards Alliance,简称CSA)“利好”频出,不仅为智能家居领域的设备制造商们提供了更为快速便捷的Matter认证流程,而且苹果、三星与谷歌等智能家居平台厂商都表示会接纳CSA的Matter认证体系,并计划将其整合至各自的“Works with”项目中。那么,在本轮“利好”背景下,智能家居的设备制造商们该如何捉住机会,“掘金”万亿市场呢?重认证快通道计划,为家居设备
    华普微HOPERF 2025-01-16 10:22 176浏览
  • 随着消费者对汽车驾乘体验的要求不断攀升,汽车照明系统作为确保道路安全、提升驾驶体验以及实现车辆与环境交互的重要组成,日益受到业界的高度重视。近日,2024 DVN(上海)国际汽车照明研讨会圆满落幕。作为照明与传感创新的全球领导者,艾迈斯欧司朗受邀参与主题演讲,并现场展示了其多项前沿技术。本届研讨会汇聚来自全球各地400余名汽车、照明、光源及Tier 2供应商的专业人士及专家共聚一堂。在研讨会第一环节中,艾迈斯欧司朗系统解决方案工程副总裁 Joachim Reill以深厚的专业素养,主持该环节多位
    艾迈斯欧司朗 2025-01-16 20:51 108浏览
  • 百佳泰特为您整理2025年1月各大Logo的最新规格信息,本月有更新信息的logo有HDMI、Wi-Fi、Bluetooth、DisplayHDR、ClearMR、Intel EVO。HDMI®▶ 2025年1月6日,HDMI Forum, Inc. 宣布即将发布HDMI规范2.2版本。新规范将支持更高的分辨率和刷新率,并提供更多高质量选项。更快的96Gbps 带宽可满足数据密集型沉浸式和虚拟应用对传输的要求,如 AR/VR/MR、空间现实和光场显示,以及各种商业应用,如大型数字标牌、医疗成像和
    百佳泰测试实验室 2025-01-16 15:41 157浏览
  • 电竞鼠标应用环境与客户需求电竞行业近年来发展迅速,「鼠标延迟」已成为决定游戏体验与比赛结果的关键因素。从技术角度来看,传统鼠标的延迟大约为20毫秒,入门级电竞鼠标通常为5毫秒,而高阶电竞鼠标的延迟可降低至仅2毫秒。这些差异看似微小,但在竞技激烈的游戏中,尤其在对反应和速度要求极高的场景中,每一毫秒的优化都可能带来致胜的优势。电竞比赛的普及促使玩家更加渴望降低鼠标延迟以提升竞技表现。他们希望通过精确的测试,了解不同操作系统与设定对延迟的具体影响,并寻求最佳配置方案来获得竞技优势。这样的需求推动市场
    百佳泰测试实验室 2025-01-16 15:45 233浏览
  • 实用性高值得收藏!! (时源芯微)时源专注于EMC整改与服务,配备完整器件 TVS全称Transient Voltage Suppre,亦称TVS管、瞬态抑制二极管等,有单向和双向之分。单向TVS 一般应用于直流供电电路,双向TVS 应用于电压交变的电路。在直流电路的应用中,TVS被并联接入电路中。在电路处于正常运行状态时,TVS会保持截止状态,从而不对电路的正常工作产生任何影响。然而,一旦电路中出现异常的过电压,并且这个电压达到TVS的击穿阈值时,TVS的状态就会
    时源芯微 2025-01-16 14:23 151浏览
  • 晶台光耦KL817和KL3053在小家电产品(如微波炉等)辅助电源中的广泛应用。具备小功率、高性能、高度集成以及低待机功耗的特点,同时支持宽输入电压范围。▲光耦在实物应用中的产品图其一次侧集成了交流电压过零检测与信号输出功能,该功能产生的过零信号可用于精确控制继电器、可控硅等器件的过零开关动作,从而有效减小开关应力,显著提升器件的使用寿命。通过高度的集成化和先进的控制技术,该电源大幅减少了所需的外围器件数量,不仅降低了系统成本和体积,还进一步增强了整体的可靠性。▲电路示意图该电路的过零检测信号由
    晶台光耦 2025-01-16 10:12 97浏览
  • 全球领先的光学解决方案供应商艾迈斯欧司朗(SIX:AMS)近日宣布,与汽车技术领先者法雷奥合作,采用创新的开放系统协议(OSP)技术,旨在改变汽车内饰照明方式,革新汽车行业座舱照明理念。结合艾迈斯欧司朗开创性的OSIRE® E3731i智能LED和法雷奥的动态环境照明系统,两家公司将为车辆内饰设计和功能设立一套全新标准。汽车内饰照明的作用日益凸显,座舱设计的主流趋势应满足终端用户的需求:即易于使用、个性化,并能提供符合用户生活方式的清晰信息。因此,动态环境照明带来了众多新机遇。智能LED的应用已
    艾迈斯欧司朗 2025-01-15 19:00 78浏览
  • 日前,商务部等部门办公厅印发《手机、平板、智能手表(手环)购新补贴实施方案》明确,个人消费者购买手机、平板、智能手表(手环)3类数码产品(单件销售价格不超过6000元),可享受购新补贴。每人每类可补贴1件,每件补贴比例为减去生产、流通环节及移动运营商所有优惠后最终销售价格的15%,每件最高不超过500元。目前,京东已经做好了承接手机、平板等数码产品国补优惠的落地准备工作,未来随着各省市关于手机、平板等品类的国补开启,京东将第一时间率先上线,满足消费者的换新升级需求。为保障国补的真实有效发放,基于
    华尔街科技眼 2025-01-17 10:44 126浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦