精华内容
下载资源
问答
  • 多用户检测中匹配滤波器的研究与实现,赵彦龙,李艳萍,首先简要介绍匹配滤波器在多用户检测中的作用,以及多用户检测匹配滤波器的基本结构和工作原理,在此基础上提出了一种基于FPGA(Fiel
  • 激光测高仪不仅可以精确测量目标的距离,还能够从回波信号中...通过对测高系统中信号检测单元分析,采用匹配滤波对回波信号进行处理,达到了理想的滤波效果,这对特征信号的提取和提高系统的探测精度起到了关键的作用
  •  注意:其对图像的旋转也具有一定的适应性,其出现特征提取不好的时候:当图像的旋转角度介于两个滤波器的方向之间时,这会导致图像的纹理提取产生不同,下面的例子是图像的旋转角度接近pi*3/4度时的纹理,其是有点...

    1、作用:Gabor小波可以方便的提取图像在各个尺度和方向上的纹理信息,同时在一定程度上降低了图像中光照变化和噪声的影响。

    其对光照不敏感的例子:


        注意:其对图像的旋转也具有一定的适应性。其出现特征提取不好的时候:当图像的旋转角度介于两个滤波器的方向之间时,这会导致图像的纹理提取产生不同,下面的例子是图像的旋转角度接近pi*3/4度时的纹理,其是有点失真的,但总体也能提取出滤波器方向上的纹理。


    一、什么是Gabor函数(以下内容含部分翻译自维基百科)

      在图像处理中,Gabor函数是一个用于边缘提取的线性滤波器。Gabor滤波器的频率和方向表达同人类视觉系统类似。研究发现,Gabor滤波器十分适合纹理表达和分离。在空间域中,一个二维Gabor滤波器是一个由正弦平面波调制的高斯核函数。

      还有,生物学实验发现,Gabor滤波器可以很好地近似单细胞的感受野函数(光强刺激下的传递函数),什么视皮层内的超柱,bla...bla,总之是这方面仿生的数学模型。

      另外,网上有一种说法,gabor分为实部和虚部,用实部进行滤波后图像会平滑;虚部滤波后用来检测边缘。【来自百度知道某个大神的回答】,我查了文献,发现的确有人用Gabor的奇函数部分做边缘提取(《基于Gabor滤波器的边缘检测算法》 无线电工程 2000年第3卷第30期)。另外,从我的实验结果也有类似的发现。暂且认为这个对的吧。

      Gabor滤波器的脉冲响应,可以定义为一个正弦波(对于二维Gabor滤波器是正弦平面波)乘以高斯函数。由于乘法卷积性质,Gabor滤波器的脉冲响应的傅立叶变换是其调和函数的傅立叶变换和高斯函数傅立叶变换的卷积。该滤波器由实部和虚部组成,二者相互正交。一组不同频率不同方向的Gabor函数数组对于图像特征提取非常有用。


     二维Gabor滤波器表达式

    用Gabor 函数形成的二维Gabor 滤波器具有在空间域和频率域同时取得最优局部化的特性,因此能够很好地描述对应于空间频率(尺度)、空间位置及方向选择性的局部结构信息。Gabor滤波器的频率和方向表示接近人类视觉系统对于频率和方向的表示,并且它们常备用于纹理表示和描述。在图像处理领域,Gabor滤波器是一个用于边缘检测的线性滤波器。,在空域,一个2维的Gabor滤波器是一个正弦平面波和高斯核函数的乘积。Gabor滤波器是自相似的,也就是说,所有Gabor滤波器都可以从一个母小波经过膨胀和旋转产生。实际应用中,Gabor滤波器可以在频域的不同尺度,不同方向上提取相关特征。

     clip_image054[4]

    另一个二维Gabor函数的数学表达:

    复数表达:

    实数部分:

    虚数部分:

       

    其中:



    下面介绍公式中各个参数的含义,及参数如何配置问题【都从老外那翻译来的】:

    波长(λ):它的值以像素为单位指定,通常大于等于2.但不能大于输入图像尺寸的五分之一。

    方向(θ):这个参数指定了Gabor函数并行条纹的方向,它的取值为0到360度

    相位偏移(φ):它的取值范围为-180度到180度。其中,0he180度分别对应中心对称的center-on函数和center-off函数,而-90度和90度对应反对称函数,其一般为0。

    长宽比γ):空间纵横比,决定了Gabor函数形状(support,我翻译为形状)的椭圆率(ellipticity)。当γ= 1时,形状是圆的,即想、y

    高斯函数的标准差相当。当γ< 1时,形状随着平行条纹方向而拉长。通常该值为0.5,其相当于x、跟y的标准差不是相同的σ,而是σ1、σ2

    带宽(b):Gabor滤波器的半响应空间频率带宽b和σ/ λ的比率有关,其中σ表示Gabor函数的高斯因子的标准差,如下:


    σ的值不能直接设置,它仅随着带宽b变化。带宽值必须是正实数,通常为1,此时,标准差和波长的关系为:σ= 0.56 λ。带宽越小,标准差越大,Gabor形状越大,可见平行兴奋和抑制区条纹数量越多。

    下面给出,不同参数配置下的Gabor核函数效果图,大小均100*100:

    a.波长对比组【方向为:0,相位偏移量为:0,纵横比率为:0.5,带宽为:1,下图波长分别为5,10,15】


    b.方向对比组【波长为:10,相位偏移量为:0,空间纵横比为:0.5,带宽为:1,方向分别为:0,45,90】


    c.相位偏移量对比组【波长为:10,方向为:0,空间纵横比:0.5,带宽:1,相位偏移量分别为:0,180,-90,90】


    d.空间纵横比对比组【波长:10,相位偏移量:0,方向:0,带宽:1,空间纵横比分别为:0.5,1】


    e.带宽对比组【波长:10,方向:0,相位偏移量:0,空间纵横比:0.5,带宽分别为:0.5,1,2】



    1) Gabor优点

    Gabor小波与人类视觉系统中简单细胞的视觉刺激响应非常相似。它在提取目标的局部空间和频率域信息方面具有良好的特性。虽然Gabor小波本身并不能构成正交基,但在特定参数下可构成紧框架。Gabor小波对于图像的边缘敏感,能够提供良好的方向选择和尺度选择特性,而且对于光照变化不敏感,能够提供对光照变化良好的适应性。上述特点使Gabor小波被广泛应用于视觉信息理解。

    Gabor滤波器和脊椎动物视觉皮层感受野响应的比较:第一行代表脊椎动物的视觉皮层感受野,第二行是Gabor滤波器,第三行是两者的残差。可见两者相差极小。Gabor滤波器的这一性质,使得其在视觉领域中经常被用来作图像的预处理。

    clip_image012[4]




    二、gabor函数实现:

    matlab版本,我从pudn上找来的,但他的gabor函数,我没怎么看明白:

    gabor函数:

    [plain] view plaincopy在CODE上查看代码片派生到我的代码片
    1. function gabor_k = compute(x,y,f0,theta)  
    2. r = 1; g = 1;  
    3. x1 = x*cos(theta) + y*sin(theta);  
    4. y1 = -x*sin(theta) + y*cos(theta);  
    5. gabor_k = f0^2/(pi*r*g)*exp(-(f0^2*x1^2/r^2+f0^2*y1^2/g^2))*exp(i*2*pi*f0*x1);   
    [plain] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. function gabor_k = compute(x,y,f0,theta)  
    2. r = 1; g = 1;  
    3. x1 = x*cos(theta) + y*sin(theta);  
    4. y1 = -x*sin(theta) + y*cos(theta);  
    5. gabor_k = f0^2/(pi*r*g)*exp(-(f0^2*x1^2/r^2+f0^2*y1^2/g^2))*exp(i*2*pi*f0*x1);   

    [plain] view plaincopy在CODE上查看代码片派生到我的代码片
    1. %绘制一个Gabor滤波器的空域和频域函数图  
    2. clear;  
    3. x = 0;  
    4. theta = 0;  
    5. f0 = 0.2;  
    6. for i = linspace(-15,15,50)  
    7.     x = x + 1;  
    8.     y = 0;  
    9.     for j = linspace(-15,15,50)  
    10.         y = y + 1;  
    11.         z(y,x)=compute(i,j,f0,theta);  
    12.     end  
    13. end  
    14. x = linspace(-15,15,50);  
    15. y = linspace(-15,15,50);  
    16. surf(x,y,real(z))  
    17. title('Gabor filter:real component');  
    18. xlabel('x');  
    19. ylabel('y');  
    20. zlabel('z');  
    21. figure(2);  
    22. surf(x,y,imag(z))  
    23. title('Gabor filter:imaginary component');  
    24. xlabel('x');  
    25. ylabel('y');  
    26. zlabel('z');  
    27.   
    28. Z = fft2(z);  
    29. u = linspace(-0.5,0.5,50);  
    30. v = linspace(-0.5,0.5,50);  
    31. figure(3);  
    32. surf(u,v,abs(fftshift(Z)))  
    33. title('Gabor filter:frequency component');  
    34. xlabel('u');  
    35. ylabel('v');  
    36. zlabel('Z');  
    [plain] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. %绘制一个Gabor滤波器的空域和频域函数图  
    2. clear;  
    3. x = 0;  
    4. theta = 0;  
    5. f0 = 0.2;  
    6. for i = linspace(-15,15,50)  
    7.     x = x + 1;  
    8.     y = 0;  
    9.     for j = linspace(-15,15,50)  
    10.         y = y + 1;  
    11.         z(y,x)=compute(i,j,f0,theta);  
    12.     end  
    13. end  
    14. x = linspace(-15,15,50);  
    15. y = linspace(-15,15,50);  
    16. surf(x,y,real(z))  
    17. title('Gabor filter:real component');  
    18. xlabel('x');  
    19. ylabel('y');  
    20. zlabel('z');  
    21. figure(2);  
    22. surf(x,y,imag(z))  
    23. title('Gabor filter:imaginary component');  
    24. xlabel('x');  
    25. ylabel('y');  
    26. zlabel('z');  
    27.   
    28. Z = fft2(z);  
    29. u = linspace(-0.5,0.5,50);  
    30. v = linspace(-0.5,0.5,50);  
    31. figure(3);  
    32. surf(u,v,abs(fftshift(Z)))  
    33. title('Gabor filter:frequency component');  
    34. xlabel('u');  
    35. ylabel('v');  
    36. zlabel('Z');  

    运行结果:






       

    [plain] view plaincopy在CODE上查看代码片派生到我的代码片
    1. %4个方向的Gabo滤波器通过图像显示  
    2. clear;  
    3. x = 0;  
    4. theta = pi*3/4;%用弧度0,pi/4,pi/2,pi*3/4  
    5. f0 = 0.2;   
    6. for i = linspace(-15,15,50)  
    7.     x = x + 1;  
    8.     y = 0;  
    9.     for j = linspace(-15,15,50)  
    10.         y = y + 1;  
    11.         z(y,x)=compute(i,j,f0,theta);  
    12.     end  
    13. end  
    14. z_real = real(z);  
    15. m = min(z_real(:));  
    16. z_real = z_real+abs(m);  
    17. M = max(z_real(:));  
    18. imshow(1/M*z_real);  
    19. figure(2)  
    20. z_imag = imag(z);  
    21. m = min(z_imag(:));  
    22. z_imag = z_imag+abs(m);  
    23. M = max(z_imag(:));  
    24. imshow(1/M*z_imag);  
    [plain] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. %4个方向的Gabo滤波器通过图像显示  
    2. clear;  
    3. x = 0;  
    4. theta = pi*3/4;%用弧度0,pi/4,pi/2,pi*3/4  
    5. f0 = 0.2;   
    6. for i = linspace(-15,15,50)  
    7.     x = x + 1;  
    8.     y = 0;  
    9.     for j = linspace(-15,15,50)  
    10.         y = y + 1;  
    11.         z(y,x)=compute(i,j,f0,theta);  
    12.     end  
    13. end  
    14. z_real = real(z);  
    15. m = min(z_real(:));  
    16. z_real = z_real+abs(m);  
    17. M = max(z_real(:));  
    18. imshow(1/M*z_real);  
    19. figure(2)  
    20. z_imag = imag(z);  
    21. m = min(z_imag(:));  
    22. z_imag = z_imag+abs(m);  
    23. M = max(z_imag(:));  
    24. imshow(1/M*z_imag);  

    运行效果:

    实数部分:

    虚数部分:

    [plain] view plaincopy在CODE上查看代码片派生到我的代码片
    1. %4个方向的Gabor滤波器对lena进行滤波  
    2. clear;  
    3. I = imread('.\pic\lena.bmp');  
    4. f0 = 0.2;   
    5. count = 0;  
    6. for theta = [0,pi/4,pi/2,pi*3/4];%用弧度0,pi/4,pi/2,pi*3/4  
    7.     count = count + 1;  
    8.     x = 0;  
    9.     for i = linspace(-8,8,11)  
    10.         x = x + 1;  
    11.         y = 0;  
    12.         for j = linspace(-8,8,11)  
    13.             y = y + 1;  
    14.             z(y,x)=compute(i,j,f0,theta);  
    15.         end  
    16.     end  
    17.     figure(count);  
    18.     filtered = filter2(z,I,'valid');  
    19.     f = abs(filtered);  
    20.     imshow(f/max(f(:)))  
    21. end  
    [plain] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. %4个方向的Gabor滤波器对lena进行滤波  
    2. clear;  
    3. I = imread('.\pic\lena.bmp');  
    4. f0 = 0.2;   
    5. count = 0;  
    6. for theta = [0,pi/4,pi/2,pi*3/4];%用弧度0,pi/4,pi/2,pi*3/4  
    7.     count = count + 1;  
    8.     x = 0;  
    9.     for i = linspace(-8,8,11)  
    10.         x = x + 1;  
    11.         y = 0;  
    12.         for j = linspace(-8,8,11)  
    13.             y = y + 1;  
    14.             z(y,x)=compute(i,j,f0,theta);  
    15.         end  
    16.     end  
    17.     figure(count);  
    18.     filtered = filter2(z,I,'valid');  
    19.     f = abs(filtered);  
    20.     imshow(f/max(f(:)))  
    21. end  

    运行效果:

    下面是自己修改的程序:

    %4个方向的Gabo滤波器通过图像显示 
    close all;
    clear;  
    x = 0;  
    theta =0;%用弧度0,pi/4,pi/2,pi*3/4  
    f0 = 0.2;
    count=1;
    I=imread('555.jpg');
    imshow(I);
    figure(1);
    I1=rgb2gray(I);
    for theta=[0,pi/4,pi/2,pi*3/4]
        count=count+1;
        x=0;
    for i = linspace(-15,15,50)  
        x = x + 1;  
        y = 0;  
        for j = linspace(-15,15,50)  
            y = y + 1;  
            z(y,x)=Gabor_compter(i,j,f0,theta); 
        end  
    end
    figure(count);
    tic
    filtered=filter2(z,I1,'valid'); %滤波器的左上角与数据的左上角重合,2*2的滤波器则是以左上角得数为代替数
    toc
    f=abs(filtered);
    imshow(f/max(f(:)));
    end
    count=count+1;
    figure(count)  
    z_real = real(z);  
    m = min(z_real(:));  
    z_real = z_real+abs(m);  
    M = max(z_real(:));  
    imshow(1/M*z_real); 
    count=count+1;
    figure(count)  
    z_imag = imag(z); 
    m = min(z_imag(:));  
    z_imag = z_imag+abs(m); %这里是为了去掉负值很小的数e-5,、10几的小数。
    M = max(z_imag(:));  
    imshow(1/M*z_imag); 
    % mi=min(z_imag(:));
    % ma=max(z_imag(:));
    % img2=1/(ma-mi)*z_imag;
    % imshow(z_imag);
    其中Gabor_compter.m里的函数Gabor_compter程序如下:

    function gabor_k = Gabor_compter(x,y,f0,theta)  
    r =1; g =1;    %其反映的就是长宽比,空间纵横比
    x1 = x*cos(theta) + y*sin(theta);  
    y1 = -x*sin(theta) + y*cos(theta);  
    gabor_k = f0^2/(pi*r*g)*exp(-(f0^2*x1^2/r^2+f0^2*y1^2/g^2))*exp(i*2*pi*f0*x1); %f0就相当于波长的倒数,其反映波长λ

    2、图像匹配上的作用

    其在匹配上的方法步骤一般为:想进行Gabor滤波器进行纹理特征提取;利用DCT变换进行降维处理;选取DCT变换后的图像左上角的信息,进行Z字形取数,可以有效的提取表征图像的较大系数信息;然后把得到的特征向量与库里的特征向量进行计算:|e-Xi|/|X|,若相似度小于阈值,则说明匹配成功。



    展开全文
  • rrc filter是用来做signal shaping,目的...升余弦滚降信号用来消除码间串扰,实际实现时采用方式是由发送端基带成行滤波器和接收端的匹配滤波器两个环节公共实现。传输系统传递函数二者乘积,所以每个环节均

    rrc filter是用来做signal shaping的,目的是在一定的带宽要求下,尽量的减少isi,匹配滤波的目标也是为了修正isi带来的信号崎变。这两个的目标是相同的,但是一个是避免isi,一个是修正isi。

    isi就是码间串扰

    升余弦滚降信号用来消除码间串扰,实际实现时采用的方式是由发送端的基带成行滤波器和接收端的匹配滤波器两个环节公共实现。传输系统的传递函数二者的乘积,所以每个环节均为平方根升余弦滚降滤波器。这样可以降低滤波器的实现难度

    数字通信中,实际发射出的信号是各个离散样值序列通过成形滤波器后的成形脉冲序列。
    匹配滤波器是为了使得在抽样时刻信噪比最大。
    当发端成形滤波器用根升余弦滤波器,接收端同样用根升余弦滤波器匹配滤波时,
    既能够使得抽样时刻信噪比最高(即完成匹配滤波器的作用),
    又能够在一定的带限平坦信道中不引入码间干扰(满足Nyquist无码间干扰准则)。 

    展开全文
  • 开关电源输入滤波器的阻抗匹配pdf,在设计和选用电源滤波器的过程中系统工程师发现 ,加了滤波器以后作用不大 ,甚至会发生某些频段的噪声变大。造成该现象的主要原因之一是电源滤波器的输出阻抗和开关电源输入阻抗...
  • 另外,随着入射光角度的变化,衍射光的波长发生变化的同时,其线宽以及角孔径发生明显变化,通过调整入射光的角度可以相应改变衍射光的线宽,实现窄带的声光滤波,提高声光滤波器的光谱分辨本领,也可以调整入射光的...
  • 研究非共线性声光可调谐滤波器 (AOTF) 在一般相位匹配条件下声光相互作用关系。对于通常设计制造声光可调谐滤波器,它o光和e光具有不同波长,应用中无法同时使用此两束衍射光,为了使可用光强增大,应当使两束...
  • 凭借通道之间的 2° 相位匹配精度,LTC6602 可以在那些需要高度匹配滤波器的应用 (例如:收发器 I 和 Q 通道) 中使用。由于具有增益可编程性以及全差分输入和输出,因而简化了大多数系统中的实现方案。  LTC6602 ...
  • 凭借通道之间的 2° 相位匹配精度,LTC6602 可以在那些需要高度匹配滤波器的应用 (例如:收发器 I 和 Q 通道) 中使用。由于具有增益可编程性以及全差分输入和输出,因而简化了大多数系统中的实现方案。  LTC6602 ...
  • 当扼流圈插入电路后,其提供噪声抑制效果,不但取决于扼流圈阻抗ZF大小,也与扼流圈所在电路前后阻抗(即源阻抗和...这里,我们特别提出噪声失配概念有利于对噪声与噪声滤波器相互作用的分析(见后面应用原理部分)。
  • 通过ADS电路仿真以及HFSS软件三维建模设计,滤波器的加工测试结果与电磁仿真结果相匹配,四级带通滤波器的中心频率为1.46 GHz,带宽为250 MHz,通带范围内插入损耗均优于2.56 dB,在0 GHz~1.22 GHz频率的带外衰减...
  •  滤波器的基础是谐振电路,它是一个二端口网络,对通带内的频率信号呈现匹配传输,对阻带频率信号失配而进行发射衰减,从而实现信号频谱过滤功能。微波带通滤波器在无线通信系统中起着至关重要的作用,尤其是在接收...
  •  滤波器的基础是谐振电路,它是一个二端口网络,对通带内的频率信号呈现匹配传输,对阻带频率信号失配而进行发射衰减,从而实现信号频谱过滤功能。微波带通滤波器在无线通信系统中起着至关重要的作用,尤其是在接收...
  • 各类转换器基本作用是将信息转换成便于传输和处理形式,要求转换过程中信息不发生畸变、失真、延迟等,因此对转换器线性度、输入输出阻抗匹配和隔离等有一定要求:①线性特性。要求转换器输出信号Y与输入...
  • 各类转换器基本作用是将信息转换成便于传输和处理形式,要求转换过程中信息不发生畸变、失真、延迟等,因此对转换器线性度、输入输出阻抗匹配和隔离等有一定要求:①线性特性。要求转换器输出信号Y与输入...
  • 利用两布拉格光栅反射作用的联合效应形成双光栅耦合器,具有结构紧凑、滤波效率显著加强优点。通过详细分析光栅写入特性对器件性能影响,指出优化光栅在耦合区中位置,不仅可以使得满足布拉格匹配条件信号...
  • Python模拟粒子滤波器定位过程

    千次阅读 2019-02-21 11:28:21
    定位技术在无人驾驶汽车与自主机器人领域有着关键作用,基于概率常用手段是借助Range Sensor(通常使用是激光雷达),或者摄像头(单目或者双目)进行前期建图,在定位时将传感器扫描得到数据与地图进行匹配,并...

    前言

    定位技术在无人驾驶汽车与自主机器人领域有着关键作用,基于概率的常用的手段是借助Range Sensor(通常使用的是激光雷达),或者摄像头(单目或者双目)进行前期建图,在定位时将传感器扫描得到的数据与地图进行匹配,并结合使用滤波器,确定机器人状态向量在状态空间中的概率分布。本文将忽略扫描匹配的具体过程,基于已经获得高精度地图,可以直接测量地标距离这一前提,使用粒子滤波器进行二维平面中的机器人定位过程的模拟。机器人默认为原型两轮机器人,使用差速方式转向。

    编程实现

    from matplotlib import pyplot as plt
    from math import *
    import random
    

    需要使用的库

    • random
      用于生成粒子
    • math
      各种计算
    Robot类

    以下介绍Robot类中的Method

    1. 初始化
    class robot:
        def __init__(self):
            # 以下三行用于随机生成粒子
            self.x = random.random() * world_size
            self.y = random.random() * world_size
            self.orientation = random.random() * 2.0 * pi
            # 设定噪声
            self.forward_noise = 0.0
            self.turn_noise    = 0.0
            self.sense_noise   = 0.0
    

    机器人的位姿包括在二维平面中的坐标,以及方位角。方位角为0的方向即X轴正方向。开始时机器人的位姿是未知的,需要使粒子遍布整个“世界”。
    而噪声包括运动噪声与测量噪声。运动噪声又分为向前运动的噪声与转向的噪声。

    关于噪声

    传感器的测量都是有误差的,本文将传感器的测量值建模为真实值加上高斯噪声,用来模拟真实环境下的传感器测量值。程序中设定的noise为高斯噪声的方差。初始化为0

    2. 位置设定
        def set(self, new_x, new_y, new_orientation):
            if new_x < 0 or new_x >= world_size:
                raise (ValueError, 'X coordinate out of bound')
            if new_y < 0 or new_y >= world_size:
                raise (ValueError, 'Y coordinate out of bound')
            if new_orientation < 0 or new_orientation >= 2 * pi:
                raise (ValueError, 'Orientation must be in [0..2pi]')
            self.x = float(new_x)
            self.y = float(new_y)
            self.orientation = float(new_orientation)
    

    初始化中将机器人的位置设定为随机值,是为了方便生成粒子,而这个method是用来设定机器人的实际位姿。

    3. 噪声设定
        def set_noise(self, new_f_noise, new_t_noise, new_s_noise):
            # makes it possible to change the noise parameters
            # this is often useful in particle filters
            self.forward_noise = float(new_f_noise);
            self.turn_noise    = float(new_t_noise);
            self.sense_noise   = float(new_s_noise);
    

    噪声的设定,前面解释过了。机器人本身以及每个粒子的噪声值都需要设定

    4. 距离测量
        def sense(self):
            # measure distances of landmarks and get a result with gaussian noise
            Z = []
            for i in range(len(landmarks)):
                # true value
                dist = sqrt((self.x - landmarks[i][0]) ** 2 + (self.y - landmarks[i][1]) ** 2)
                dist += random.gauss(0.0, self.sense_noise)
                Z.append(dist)
            return Z
    

    测量机器人到各个地标的距离,依然是真实值与高斯噪声之和。
    其中真实值的计算利用勾股定理,高斯噪声则是使用了随机数中gauss()方法

    5. 移动
        def move(self, turn, forward):
            if forward < 0:
                raise (ValueError, 'Robot cant move backwards')
            # 转向
            orientation = self.orientation + float(turn) + random.gauss(0.0, self.turn_noise)
            orientation %= 2 * pi
            
            # 前进
            dist = float(forward) + random.gauss(0.0, self.forward_noise)
            x = self.x + (cos(orientation) * dist)
            y = self.y + (sin(orientation) * dist)
            x %= world_size    # cyclic truncate
            y %= world_size
            
            # 返回移动后的机器人
            res = robot()
            res.set(x, y, orientation)
            res.set_noise(self.forward_noise, self.turn_noise, self.sense_noise)
            return res
    

    我们假设机器人只能原地转向或者向前移动,在每次移动的过程中先转向,然后前进,这个method更新机器人与粒子的位姿,返回一个新的对象

    6. 高斯函数
        def Gaussian(self, mu, sigma, x):
            return exp(- ((mu - x) ** 2) / (sigma ** 2) / 2.0) / sqrt(2.0 * pi * (sigma ** 2))
    

    高斯函数的公式如下
    G(x)=(2πσ2)12exp{12(xμ)2σ2}G(x)=(2\pi\sigma^2)^{-\frac{1}{2}} exp\{ -\frac{1}{2} \frac{(x-\mu)^2}{\sigma^2} \}

    7. 权重计算
        def measurement_prob(self, measurement):
            prob = 1.0
            for i in range(len(landmarks)):
                dist = sqrt((self.x - landmarks[i][0]) ** 2 + (self.y - landmarks[i][1]) ** 2)
                prob *= self.Gaussian(dist, self.sense_noise, measurement[i])
            return prob
    

    这是粒子滤波器的关键一步。在粒子滤波器的迭代依赖于基于权值的重采样,权值的大小决定了一次迭代中哪些粒子能够存。

    权值的计算

    基于权值的重采样相当于卡尔曼滤波器中的Measurement Update。首先机器人本身对路标进行距离测量。例如对LandmarkiLandmark_i进行测量,得到测量值ZiZ_i。而对于每个粒子来说,权重即为在该粒子所在的点测量到ZiZ_i的“概率”。

    举例说明

    机器人的真实坐标为(x0,y0)(x_0,y_0),路标的坐标为(xL1,yL1)(x_{L_1},y_{L_1}),则真实的距离为
    dist=(x0xL1)2+(y0yL1)2dist=\sqrt{(x_0-x_{L1})^2+(y_0-y_{L1})^2}
    而根据模型,测量到的距离还要在此基础上加上高斯误差,即为ZiZ_i
    测量的高斯噪声方差为σZ2\sigma_Z^2 ,均值μ=0\mu=0
    假设粒子群中的某个粒子pip_i坐标为(xpi,ypi)(x_{pi},y_{pi}) (这不是测出来的,这是随机生成的,因此真实坐标是已知的)。同样利用勾股定理计算出pip_iLandmarkiLandmark_i的距离distpidist_{p_i}
    回顾一下高斯函数
    G(x)=(2πσ2)12exp{12(xμ)2σ2}G(x)=(2\pi\sigma^2)^{-\frac{1}{2}} exp\{ -\frac{1}{2} \frac{(x-\mu)^2}{\sigma^2} \}
    将它改写为
    G(μ,σ2,x)=(2πσ2)12exp{12(xμ)2σ2}G(\mu,\sigma^2,x)=(2\pi\sigma^2)^{-\frac{1}{2}} exp\{ -\frac{1}{2} \frac{(x-\mu)^2}{\sigma^2} \}
    G(distp,σZ2,Zi)G(dist_p, \sigma_Z^2,Z_i)即为在粒子pip_i处测量到ZiZ_i的“概率”。(这里概率要加引号是由于高斯函数的值并不等于单点的概率)
    由于我们的路标有多个,因此需要将对于每个路标的概率相乘。因此权重
    wpi=i=1nG(distp,σZ2,Zi)w_{p_i}=\sum_{i=1}^n G(dist_p, \sigma_Z^2,Z_i)

    主程序
    myrobot = robot()
    myrobot = myrobot.set_noise(0.05, 0.05, 5.0)
    Z = myrobot.sense()
    N = 1000
    T = 10 
    

    创建一个机器人对象,并对路标进行测量。ZZ保存测量的值。NNTT分别为粒子数量与迭代次数。

    p = []
    for i in range(N):
        r = robot()
        r.set_noise(0.05, 0.05, 5.0)
        p.append(r)
    

    创建粒子群,pp是一个用来保存粒子群的列表。robot类的初始化函数可以随机生成一个粒子,且使其在二维平面内服从均匀分布。由此生成1000个粒子的表示的初始分布。

    以下开始进行迭代

    for t in range(T):
        myrobot = myrobot.move(0.1, 5.0)
        Z = myrobot.sense()
    

    移动机器人并进行一次测量。

        p2 = []
        for i in range(N):
            p2.append(p[i].move(0.1, 5.0))
        p = p2
    

    移动所有的粒子,更新它们的位置,并显示出来。
    我们知道在卡尔曼滤波器中,运动更新将会增加机器人位置测量的不确定性。这里由于robot.move()这个方法是引入了高斯噪声的,因此每个粒子移动的距离以及转过的角度都会产生一定差异,从而看上去有种发散的感觉。

        w = []
        for i in range(N):
            w.append(p[i].measurement_prob(Z))
    

    计算每个粒子的权重。前面说过了,权重就是在该粒子处测量到ZZ的“概率”。

    重采样
        p3 = []
        index = int(random.random() * N)
        beta = 0.0
        mw = max(w)
        for i in range(N):
            beta += random.random() * 2.0 * mw
            while beta >  w[index]:
                beta -= w[index]
                index = (index + 1) % N
            p3.append(p[index])
        p = p3
    

    我称之为 幸运轮盘 算法 (Wheel of Fortune)

    粒子滤波器的迭代依赖于基于权重的重采样,权重一定程度上表示了在重采样的过程中,采到该粒子的概率,也可以认为权重反映了粒子的概率分布。在实现重采样的过程中,我们将所有粒子的集合看作一个轮盘,用饼状图来表示权重大小,权重越大的粒子占据的圆弧越长,权重越小的粒子占的越短。例如这张图上被分成10块,分别代表10个粒子,每块的大小表示权重的大小。可以看到区域5表示的粒子权重最大,因此,在这个粒子处的测量值与机器人本身的测量值一致的可能性最高。
    在这里插入图片描述
    然后从中随机取NN个值。取到的粒子即组成新的粒子群。就像幸运轮盘一样,让它转起来,看指针停在哪个区域。在上图中区域5占据圆弧最大,重采样采到这个粒子的概率就比较高,而像区域4这种,就可能在重采样中被淘汰。因此你转动轮盘10次,有可能指针停在区域5有2次,而一次也没有停在区域4,这样你重采样得到的10个粒子,就出现了两个重合的,看起里就好像是区域4的粒子消失了。这就是粒子滤波器的迭代过程。
    在这里插入图片描述
    虽然粒子在测量更新(Measurement Update)中被淘汰,但由于运动更新(Motion Update)中还存在误差,所以在每一次运动更新之后,会感觉粒子好像散开了,然后在下一次测量更新中再次收敛,如此循环往复。

    结果

    按照上面的流程进行运行,并使用matplotlib进行可视化处理得到结果如下
    在这里插入图片描述
    初始时按照据均匀分布随机生成了1000个粒子,并和机器人本体做相同运动,走了一段距离。即经过一次运动更新。
    在这里插入图片描述
    然后计算权重,重采样得到的粒子如下,可以看到很多粒子“消失了”,并产生了很多重叠。
    在这里插入图片描述
    机器人再次运动,粒子也随之运动,由于高斯噪声的存在,粒子群再次扩散开来。
    在这里插入图片描述
    再次经过测量更新,粒子开始集中。
    在这里插入图片描述
    又一次运动更新。
    在这里插入图片描述
    测量更新。可以看到粒子已经比较集中了。

    传感器的噪声参数会影响滤波器的效果,而由于其中存在很多的随机过程,每次运行的效果也可能存在很大差异。增加粒子数量可以一定程度上优化定位效果,但可能给处理器带来运算上的负担。

    待修改、更新

    展开全文
  • 在通信系统中,微波多工器由微波滤波器组成,主要用于分离和合并窄带射频信号,起着十分重要的作用。传统方法鲜有考虑滤波器负载为复阻抗的情况,针对此问题,介绍了一种负载为复阻抗的微波滤波器直接综合方法,并将...
  • 要想避免多余噪声信号传播,对仪表放大器输入端低通滤波器中各组件进行正确的匹配和调节至关重要。最终,才能让内部电磁干扰/无线电频率干扰 (EMI/RFI) 滤波和 CMRR 共同作用,降低其他噪声,从而达到可以接受...
  • 要想避免多余噪声信号传播,对仪表放大器输入端低通滤波器中各组件进行正确的匹配和调节至关重要。 最终,才能让内部电磁干扰/无线电频率干扰 (EMI/RFI) 滤波和 CMRR 共同作用,降低其他噪声,从而达到可以接受...
  • 通过在光纤消逝场间耦合作用中引入光栅折射率调制扰动,推导出用于分析各种光纤光栅耦合器型滤波器滤波响应特性统一耦合模方程。使用Broyden迭代结合打靶法求解耦合模方程,数值计算了两光纤匹配﹑只将光栅写入...
  • 要想避免多余噪声信号传播,对仪表放大器输入端低通滤波器中各组件进行正确的匹配和调节至关重要。最终,才能让内部电磁干扰/无线电频率干扰(EMI/RFI)滤波和CMRR共同作用,降低其他噪声,从而达到可以接受信噪比...
  • 现在来分析g723基音后置滤波器 根据基音周期间,激励信号的相关性,来对激励信号做一个增强处理 相应的函数分别是 Comp_Lpf Filt_Lpf Comp_Lpf 负责计算最佳的基音延后, ...这样就能达到增加音效的作用....
    现在来分析g723基音后置滤波器

    根据基音周期间,激励信号的相关性,来对激励信号做一个增强处理
    相应的函数分别是 Comp_Lpf Filt_Lpf

    Comp_Lpf 负责计算最佳的基音延后,
    具体地说,是在基音周期延迟附近,找出最匹配当前子帧激励的60个连继激励e[i].
    使用的方法自然找自相关最大的.找到之后,对e[i]进行加权,与当前子帧的激励相加,
    这样就能达到增加音效的作用.查找分两个方向进行,前向与后向.
    公式见itu 723文档3.6节 式42

    现在来看代码,
    一开始,就查找前向后向自相关最大的两个延迟
    /* Find both indices */ //lsc 根据基音周期,计算前向与后向相关,在基音周期附近找出最匹配的位置,可能会用它们来加强语音数据
    Bindx = Find_B( Buff, Olp, Sfc ) ;//lsc 这个返回负值
    Findx = Find_F( Buff, Olp, Sfc ) ;//lsc 这个返回正值

    Find_B Find_F 这两个函数十分类似,只是查找的方向不同,一个前向,一个后向,
    即,找出基音周期附近,自相关最大的那个延迟索引,如果最大的自相关为负值,忽略这个关联,
    前向后向都为负值,则基音后置滤波就不进行了

    Find_B函数:
    Word16 Find_B( Word16 *Buff, Word16 Olp, Word16 Sfc )
    {
    int i,j ;

    Word16 Indx = 0 ;

    Word32 Acc0,Acc1 ;

    if ( Olp > (Word16) (PitchMax-3) )
    Olp = (Word16) (PitchMax-3) ;

    Acc1 = (Word32) 0 ;

    for ( i = (int)Olp-3 ; i <= (int)Olp+3 ; i ++ ) {

    Acc0 = (Word32) 0 ;
    for ( j = 0 ; j < SubFrLen ; j ++ )
    Acc0 = L_mac( Acc0, Buff[PitchMax+(int)Sfc*SubFrLen+j],
    Buff[PitchMax+(int)Sfc*SubFrLen-i+j] ) ;//lsc 这里就是在计算自相关了
    if ( Acc0 > Acc1 ) {//lsc 只有大零的情况下,才会找出最大的自相关取引的索引Indx
    Acc1 = Acc0 ;
    Indx = -(Word16) i ;
    }
    }
    return Indx ;
    }

    接下来计算能量,用于计算增益
    /* Compute target energy */
    Acc0 = (Word32) 0 ;
    for ( j = 0 ; j < SubFrLen ; j ++ )
    Acc0 = L_mac( Acc0, Buff[PitchMax+(int)Sfc*SubFrLen+j],
    Buff[PitchMax+(int)Sfc*SubFrLen+j] ) ;
    Lcr[0] = Acc0 ;//lsc 当前子帧的能量

    然后是计算基音延后自相关,以及基音延后的能量
    前向和后向延后当中,选择的依据是以下两式的大小
    Cb^2/Eb Cf^2/Ef
    Cb:后向自相关 Eb:后向的能量
    Cf:前向自相关 Ef:前向的能量

    计算后向的自相关与能量的代码片段如下:
    if ( Bindx != (Word16) 0 ) {//lsc 计算backword与当前子帧互相关,以及backword的能量
    Acc0 = (Word32) 0 ;
    Acc1 = (Word32) 0 ;
    for ( j = 0 ; j < SubFrLen ; j ++ ) {
    Acc0 = L_mac( Acc0, Buff[PitchMax+(int)Sfc*SubFrLen+j],
    Buff[PitchMax+(int)Sfc*SubFrLen+(int)Bindx+j] ) ;
    Acc1 = L_mac( Acc1, Buff[PitchMax+(int)Sfc*SubFrLen+(int)Bindx+j],
    Buff[PitchMax+(int)Sfc*SubFrLen+(int)Bindx+j] ) ;
    }
    Lcr[1] = Acc0 ;//lsc 互相关
    Lcr[2] = Acc1 ;//lsc 能量
    }
    else {
    Lcr[1] = (Word32) 0 ;
    Lcr[2] = (Word32) 0 ;
    }
    前向的计算与以类似,就不例举了
    计算结果 当前子帧能量,前后向相关以及能量会被归一化存入Scr数组当中

    比较,并计算基音后置滤波的参数,比较仍然是用交叉乘绕开除法
    if ( (Bindx != (Word16) 0) && ( Findx != (Word16) 0) ) {
    Exp = mult_r( Scr[1], Scr[1] ) ;
    Acc0 = L_mult( Exp, Scr[4] ) ;//lsc 这里利用交叉乘绕开除法
    Exp = mult_r( Scr[3], Scr[3] ) ;
    Acc1 = L_mult( Exp, Scr[2] ) ;//lsc 这里利用交叉乘绕开除法
    if ( Acc0 > Acc1 )//lsc 哪个的相关性大,用哪个,因为Ten肯定是一样的,所以这一项被忽略不计算了
    Pf = Get_Ind( Bindx, Scr[0], Scr[1], Scr[2] ) ;
    else
    Pf = Get_Ind( Findx, Scr[0], Scr[3], Scr[4] ) ;
    }

    Get_Ind 这个函数负责计算基音后置滤波器参数
    这里有个基音后置滤波器是否有效的判断,
    依据基音延迟激励与当前子帧激励的相关性来判断的,itu里的定义比较绕,
    直接看代码反而简单:

    /* Check valid gain */
    Acc0 = L_mult( Ten, Enr ) ;
    Acc0 = L_shr( Acc0, (Word16) 2 ) ;
    Acc1 = L_mult( Ccr, Ccr ) ;

    if ( Acc1 > Acc0 ) {//lsc 关联的平方,比能量的1/4乘积大,实际上就是类似相关系数的定义,说明两个序列有一点的相关性
    ......

    即相关系数大于1/4即可认为两个序列是相关的
    然后是计算基音延后的加权gb,以及gp(笔者认为gp是对加权后的一个调整值,防止因为加权,反而出现激励能量变小的情况)

    代码片段如下:
    if ( Ccr >= Enr )//lsc 基音延后的加权值
    Pf.Gain = LpfConstTable[(int)WrkRate] ;
    else {
    Pf.Gain = div_s( Ccr, Enr ) ;
    Pf.Gain = mult( Pf.Gain, LpfConstTable[(int)WrkRate] ) ;
    }
    /* Compute scaling gain */ //lsc 这里是计算ppf` 即itu文档的 式 42
    Acc0 = L_deposit_h( Ten ) ;
    Acc0 = L_shr( Acc0, (Word16) 1 ) ;
    Acc0 = L_mac( Acc0, Ccr, Pf.Gain ) ;//lsc 平方展开,会有一个自相关的项,这里被加上
    Exp = mult( Pf.Gain, Pf.Gain ) ;
    Acc1 = L_mult( Enr, Exp ) ;
    Acc1 = L_shr( Acc1, (Word16) 1 ) ;
    Acc0 = L_add( Acc0, Acc1 ) ;
    Exp = round( Acc0 ) ;

    Acc1 = L_deposit_h( Ten ) ;
    Acc0 = L_deposit_h( Exp ) ;
    Acc1 = L_shr( Acc1, (Word16) 1 ) ;

    if ( Acc1 >= Acc0 )
    Exp = (Word16) 0x7fff ;
    else
    Exp = div_l( Acc1, Exp ) ;

    Acc0 = L_deposit_h( Exp ) ;
    Pf.ScGn = Sqrt_lbc( Acc0 ) ;//这里得到了gp
    }
    else {//lsc 小于能量的1/4则忽略
    Pf.Gain = (Word16) 0 ;
    Pf.ScGn = (Word16) 0x7fff ;
    }

    Pf.Gain = mult( Pf.Gain, Pf.ScGn ) ;//gp需要单独保留,而gf/gb则是不需要的 见式42

    将滤波器应用与激励信号,这个比较简单,基本是把itu文档3.6节的式42翻译成c代码
    void Filt_Lpf( Word16 *Tv, Word16 *Buff, PFDEF Pf, Word16 Sfc )
    {
    int i ;

    Word32 Acc0 ;

    for ( i = 0 ; i < SubFrLen ; i ++ ) {//lsc 见文档的 式42,利用基音周期的相关性,来加强当前帧的激励
    Acc0 = L_mult( Buff[PitchMax+(int)Sfc*SubFrLen+i], Pf.ScGn ) ;
    Acc0 = L_mac( Acc0, Buff[PitchMax+(int)Sfc*SubFrLen+(int)Pf.Indx+i],
    Pf.Gain ) ;
    Tv[(int)Sfc*SubFrLen+i] = round( Acc0 ) ;
    }

    return;
    }


    林绍川
    2012.01.18于杭州
    展开全文
  • 滤波器是一种用来处理信号器件或电路,主要作用是让有用信号无损耗地通过,同时尽可能地反射掉无用信号。信号相频特性和幅频特性一样,都是信号重要特征。长期以来,无论对于数字信号还是模拟信号,相位特性...
  • 为使产品达到EMI辐射标准,往往需要给系统增添一些复杂的滤波器、屏蔽密封材料和其他一些昂贵元器件。由于电磁相互作用的本质相当复杂,因而确定EMI辐射究竟是从什么地方泄漏出去非常困难,所以降低EMI辐射常常...
  • 为使产品达到EMI辐射标准,往往需要给系统增添一些复杂的滤波器、屏蔽密封材料和其他一些昂贵元器件。由于电磁相互作用的本质相当复杂,因而确定EMI辐射究竟是从什么地方泄漏出去非常困难,所以降低EMI辐射常常...
  • 为使产品达到EMI辐射标准,往往需要给系统增添一些复杂的滤波器、屏蔽密封材料和其他一些昂贵元器件。由于电磁相互作用的本质相当复杂,因而确定EMI辐射究竟是从什么地方泄漏出去非常困难,所以降低EMI辐射常常...
  •  既然是通过以太网供电,供电/受电设备中一定不能离开 LAN Transformer (网络变压器),作为网络变压器在设备中起到是隔离、阻抗匹配和信号耦合的作用,在 PoE/PoE+网络应用中也是这个作用,同时还要满足以太网络...

空空如也

空空如也

1 2 3 4 5
收藏数 95
精华内容 38
关键字:

匹配滤波器的作用