最基本的麦克风阵列延时累加和算法,DelayAndSum beamformer

本文介绍了如何使用MATLAB实现基本的麦克风阵列延时累加和beamforming算法,涉及时域插值和频域相位调整,通过实例展示了从phased.TimeDelayBeamformer系统对象中提取并改造代码的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近从 phased.TimeDelayBeamformer 扒了它的代码,简单改造作为最基本的麦克风阵列算法学习

refer to https://www.mathworks.com/help/phased/ref/phased.timedelaybeamformer-system-object.html

一、延时累加和beamformer

可以说是最基本的麦克风阵列算法,

 

 方法很简单,就是通过平移每个通道数据到合适的位置,然后累计调整系数即可。

但问题是什么?

一般采集到的麦克风数据都是数字化的,采样点的间隔是1/fs 如果要平移的时间量刚好是N个sample点,那么刚好是有对应的 采样值的 如果平移量不是,那么得考虑下面两种方案:

1、时域上做插值,根据周围的采样点来插值插出来你想要的某些平移量的数据

2、转换到频域上操作

频域上的 延时,只要对信号 相位做调整即可,

 

具体操作:通过fft转到频域,执行相位变换,再ifft回到时域

 二、具体的matlab代码

clear all
close all
clc;

% phased.TimeDelayBeamformer

fs = 8000;

%入射角度,或者叫阵列想指向哪里,旋转角和相位角,其中相位角是离开xy平面到z轴的角度
incidentAngle = [-50;30];

%阵列采集数据
load rx

%麦克风单元数

M=11;

%阵列拓扑结构,其他任意阵列形状也可

ArrayPos = [0    0    0    0    0    0    0    0    0    0    0;
-0.2    -0.16    -0.12    -0.08    -0.04    0    0.04    0.08    0.12    0.16    0.2;
0    0    0    0    0    0    0    0    0    0    0];

%旋转角和俯仰角,

azang = incidentAngle(1,:);
elang = incidentAngle(2,:);

%导向矢量
incidentdir = [-cosd(elang).*cosd(azang);...
    -cosd(elang).*sind(azang);...
    -sind(elang)];

%延时时间

delay = ArrayPos.'*incidentdir/c;
pSampleRate = fs;

% x_steered = delayseq(rx,-delay,pSampleRate);

% 初始化
x=rx;
inputLength = size(x,1);

%刚好是“反“移动,对阵列本身的校准,这样就达到延迟一致了
dt = -delay;
dt = dt *fs;

%取整数延时部分(sample点数)
delayInt = round(dt);    % Integer delays in samples

%分数延迟部分(sample点数,单位是个)
delayFrac = dt - delayInt;

%找到最大延迟点,数据长度因为延迟而膨胀了
maxLength = inputLength+max(0, max(delayInt)); % maximum sequence length
% Define upperbound
maxLengthLimit = maxLength;

%找到合适的fft size

nfftLimit = 2^nextpow2(2*inputLength);
output = zeros(maxLengthLimit,length(dt));

% Perform delay operation,对每个延时通道
for colI=1:length(dt)

    endIdx = inputLength+delayInt(colI);
    % no operation if delayed or advanced out of scope
    if (endIdx <= 0) || (endIdx > 2*inputLength)
        continue;
    end
    tmpx = x(:,colI);
    

%如果有分数个延时点的要求,转换到频域
    if delayFrac(colI)    
        nfft = 2^nextpow2(inputLength + max(0, delayInt(colI)));
        assert(nfft <= nfftLimit);
        binStart = floor(nfft/2);
        % Notice the FFT bins must belong to [-pi, pi].
        fftBin = 2*pi*ifftshift(((0:nfft-1)-binStart).')/nfft;
        if isscalar(tmpx) && nfft==1
            tmpxd = tmpx;
        else%核心代码
            tmpxd = fft(tmpx,nfft);
            tmpxd = ifft(tmpxd(:).*exp(-1i*dt(colI)*fftBin));

        end
        %以下认为正向延迟的头几个点不要,置零

        %你可以认为从负时间轴(t<0) 的地方带(移)不过来数据,都是零

        if delayInt(colI) >= 0
            orgStart = delayInt(colI) + 1;
            newStart = delayInt(colI) + 1;
        else
            orgStart = 1;
            newStart = 1;
        end
        orgEnd = endIdx;
        if isreal(x)
           output(newStart:endIdx,colI) = real(tmpxd(orgStart:orgEnd));
        else
           output(newStart:endIdx,colI) = tmpxd(orgStart:orgEnd);
        end
    else
        % Integer sampling shifting
        if delayInt(colI) >= 0
            orgStart = 1;
            newStart = delayInt(colI) + 1;
        else
            orgStart = 1-delayInt(colI);
            newStart = 1;
        end
        orgEnd = inputLength;
        output(newStart:endIdx,colI) = tmpx(orgStart:orgEnd);
    end
    
end

% output has the same length as input
x_steered = output(1:inputLength, :);
w  = ones(M,1)/M;% 归一化权重
y = x_steered*conj(w);%相乘作和

plot(t,rx(:,6),'r:',t,y)
xlabel('Time (sec)')
ylabel('Amplitude')
legend('Original','Beamformed')

 

### 阵列信号处理在MATLAB中的实现 #### 使用Phased Array System Toolbox进行阵列信号处理 MATLAB提供了专门用于阵列信号处理的工具箱&mdash;&mdash;Phased Array System Toolbox。该工具箱支持设计、仿真和分析相控阵雷达、声纳和其他多通道传感器系统的算法[^1]。 #### 创建线性阵列并执行波束形成操作 下面展示如何创建一个简单的均匀线性阵列(ULA),并通过延迟求和(Delay-and-Sum)技术来实施基本的波束成形: ```matlab % Define array parameters numElements = 8; elementSpacing = 0.5; % Create ULA object with specified number of elements and spacing between them ulaArray = phased.ULA('NumElements', numElements, 'ElementSpacing', elementSpacing); % Specify steering direction for beamforming steeringDirection = [30; 0]; % Azimuth angle set at 30 degrees elevation kept zero % Initialize conventional beamformer pointing towards desired direction beamformer = phased.ConventionalBeamformer('SensorArray', ulaArray,... 'PropagationSpeed', physconst('LightSpeed'),... 'OperatingFrequency', 3e9,... 'WeightsOutputPort', true); % Apply the beamformer weights to form beams in specific directions [y, wts] = step(beamformer, randn(numElements, 1), steeringDirection); ``` 此代码片段展示了怎样定义一个具有八个单元组成的均匀直线天线阵,并设置这些单元之间的间隔距离;接着指定了指向角度为30度方位角的方向作为波束形成的导向方向;后通过`phased.ConventionalBeamformer`对象应用传统的延时累加法来进行实际的波束形成过程。 #### 利用内置函数探索更多高级特性 除了上述基础示例外,还可以利用MATLAB提供的其他功能进一步深入研究阵列信号处理领域内的各种复杂现象和技术细节。例如,可以调用`pattern()`函数绘制出不同参数配置下的辐射图样;或者借助`stap()`函数模拟空间时间自适应处理(STAP)。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值