zoukankan      html  css  js  c++  java
  • 多相滤波器

    前言

    多相滤波器解决的是:多速率问题。

    通过降采样、插值来改变信号的输出速率(主要利用Nyquist采样定理,保证不混叠),从而降低数据率,多相滤波器为这类操作提供了实现框架。在满足采样定理的前提下,内插/抽取并配合滤波器使用(防止混叠),可以改变数据的速率。

    多相滤波的结构也多用在信道化中(即构建滤波器组),固化系数借助硬件实现快速运算。

    一、信道化实现思路

    信道化的基本思路为:

    clc;clear all;close all
    N = 256;
    h = firls(N, [0 .2 .25 1], [1  1 0  0],[.001 .0001]);
    D = 8;
    % PolyPhase Componets
    i = 1:length(h);
    h_channel = zeros(D,length(h));
    im = sqrt(-1);
    for j = 1:D
        h_channel(j,:) = h.*exp((-im*2*pi*((j-1)*(i-1)))/D);
    end
    figure(1)
    for i = 1:D+1
        switch i
            case 1
                subplot (2,1,1);
                plot(abs(fft(h)));
                title('Orignal LPF ')
            otherwise
                subplot (2,1,2)
                plot(abs(fft(h_channel(i-1,:))));
                hold on;
                title('channelize')
        end
    end
    

      对应频谱图:

    即将频带切分成若个个区域。基于该特性,有信道化的基本思路:

    如果是实信号,D信道化之后进行D倍抽取仍然不会有频谱混叠,而经过本振以及低通滤波器之后的信号为复信号,故可以进行2D倍抽取。

     可以看出,信道化接收机的抽取器位于滤波器之后,当抽取率D很大或者滤波器阶数较高,计算效率将难以提升,这时候借助多相滤波器便可以优化。

    假设LPF:

    并取Q=N/D,N为滤波器阶数,D为抽取率。则滤波器可重写为:

    定义:

    滤波器可重写为:

    其中为多相分量,这也是多相滤波器说法的缘由。

    第k个信道可写为:

    进一步取

    从而有

    根据这一系列推导,即可得出实信号多相滤波器信道化的实现思路:

    两处相位相乘分别为:,p = 0,1,...,D-1

    二、多相滤波器设计步骤

    • 根据指标,确定滤波器类型以及阶数N
    • 求解h(n)
    • 根据信道个数,并用下式确定多相滤波器:

    三、复杂度简要分析

    以滤波器阶数N=256,抽取率(信道个数)D=16,每个信道输出1个数据,则:

    • 基于低通滤波器组的信道化需要乘法:M1 = D x (1+N) = 4112次;
    • 基于多相滤波器的信道化需要乘法:M2 = N+2*D+D*log2D = 352次;

    多相滤波器的实现思路节约了资源,且便于硬件实现。

    四、应用实例

    考虑带宽1GHz的情况,如果信道个数为16,则每一个的宽度为1e9/16=62.5e6,考虑到滤波器为实数的共轭对称性,故LPF构造依据:

    对其进行仿真验证:

    输入信号为70MHz的1)余弦信号;2)复指数信号,对于1)理论上应落在2、16两个信道,2)只落在2信道。

    clc;clear all;close all
    load coef_lpf.mat;
    fs = 1e9;
    t = 0:1/fs:1e-6;
    f0 = 70e6;
    sig = sin(2*pi*t*f0);
    len = length(sig);
    h = coef_lpf;
    N = length(h);
    D = 16;
    y = zeros(D,len);
    % PolyPhase Componets
    i = 1:length(h);
    h_channel = zeros(D,length(h));
    im = sqrt(-1);
    x_fre = linspace(0,fs,N);
    for j = 1:D
        h_channel(j,:) = h.*exp((-im*2*pi*((j-1)*(i-1)))/D);
        y(j,:) = filter(h_channel(j,:),1,sig);
    end
    figure()
    for i = 1:D+1
        switch i
            case 1
                subplot (2,1,1);
                plot(x_fre,abs(fft(h)));
                title('Orignal LPF ')
            otherwise
                subplot (2,1,2)
                plot(x_fre,abs(fft(h_channel(i-1,:))));
                hold on;
                title('channelize')
        end
    end
    x_fre1 = linspace(0,fs,len);
    figure()
    plot(x_fre1,abs(fft(sig)));
    for iter = 1:D
        if mod(iter,4) ==1
            figure()
            j = 1;
        end
        subplot(4,1,j)
        j = j+1;
        plot(x_fre1,abs(fft(y(iter,:))));
        title(['信道',num2str(iter)]);
    end
    

      仿真结果:

    信道化结果:

    情形一:

    与理论分析相符。

    情形二:

    sig = exp(-1j*2*pi*t*f0);
    

      信号只在信道2出现:

    多相滤波的实现思路也非常多,这里仅列举一种:

    clc;clear all;close all;
    load coef_lpf.mat;
    h = coef_lpf;
    %%产生信号
    fc = 70e6;
    c = 3.0e8;
    fs = 1e9;
    theta = 30/180*pi;
    lambda = c/fc;
    d = lambda/4;
    len = 2048;
    t = 0:1/fs:1/fs*(len-1);
    st = exp(-1j*2*pi*t*fc);
    Phase = 2*pi*d*sin(theta)/lambda;
    st = st/trace(st*st');
    Interformer01 = st;
    %%信道化
    D = 16;
    si = 1:length(h);
    h_channel = zeros(D,length(h));
    im = sqrt(-1);
    for j = 1:D
        h_channel(j,:) = downsample(h.*exp((im*2*pi*((si-1)*(j-1)))/D),1);
    end
    figure()
    for i = 1:D
        plot(abs(fft(h_channel(i,:))));
        hold on;
    end
    Interformer_channel = zeros(D,len/D);
    for i = 1:D
        Interformer_channel(i,:) = downsample(filter(h_channel(i,:),1,Interformer01),D);
    end
    figure()
    for i = 1:D
        subplot(4,4,i)
        plot(real((Interformer_channel(i,:))));
    end
    %%信道化实现思路
    si_new = 1:length(h)/D;
    Interformer01_py = (reshape(Interformer01,D,len/D));
    % Interformer01_py = Interformer01_py.*repmat((exp(1j/2*pi*si_new)),length(h)/D,1);
    % h_py = reshape(h,D,length(h)/D);
    h_py = fliplr(reshape(h,D,length(h)/D));%.*repmat((exp(1j/2*pi*si_new)),D,1);
    Interformer02_channel = zeros(D,len/D);
     
    for i = 1:D
       Interformer02_channel(i,:) = downsample(filter(h_py(i,:),1,Interformer01_py(i,:)),1);
    %    Interformer02_channel(i,:) = Interformer02_channel(i,:)*(-1)^(i-1)*exp(-1j*pi/2/D*(i-1));
    end
    Interformer02_channel = fft(Interformer02_channel);
    figure()
    for i = 1:D
        subplot(4,4,i)
        plot(real((Interformer02_channel(i,:))));
    end

      信道化结果:

    直接信道化:

    多相实现:

    该方式比直接实现,兔耳效应更明显。

  • 相关阅读:
    在现有项目中使用AspNet Identity 2.0 实战
    SQL 带自增长列的表的插入
    在C++中子类继承和调用父类的构造函数方法
    C++继承
    C++中重载、重写(覆盖)和隐藏的区别实例分析
    C++类
    C++中头文件(.h)和源文件(.cpp)都应该写些什么
    C++模板
    C语言字符串操作总结大全
    C++ 标准模板库(STL)
  • 原文地址:https://www.cnblogs.com/xingshansi/p/7266548.html
Copyright © 2011-2022 走看看