Dear Here
I give you a sample code for creating the filter
coefficients of a Delay and Sum beamformer. if you
have any question you can contact me on my email
palange@hotmail.fr
Have a nice day.
[code]
c = 340; % m/s
nfft = 128; % nfft length
i_omega
= -i*2*pi/c; % f will be variable
n_mic = 7;
mics = [ (-10*3:10:10*3)' zeros(7,1) ]/100;
source
= [-0.2 0.63]; % to be measured
fs = 22050; %
Sampling Frequency
f = (0:nfft-1)*fs/nfft; %
Frequency bins
W = zeros(n_mic,nfft);
d =
zeros(n_mic,1);
w = zeros(n_mic,1);
r = zeros(n_mic,1);
u = zeros(n_mic,1);
bp = zeros(nfft,181);
bps = zeros(1,181);
% Filter Coef
for
k = 1:n_mic
r(k) = norm( source - mics(k,:));
end
index = 1;
for p=f
d = exp(i_omega*p*r)./r;
w=d.*r;
w=w/abs(w'*d);
W(:,index) = w;
theta_v=[-90:1:90];
source_n=norm(source);
for theta = theta_v
s=[source_n*sin(theta*pi/180)
source_n*cos(theta*pi/180)];
for k=1:n_mic
u(k) = norm(s-mics(k,:));
end
d=exp(i_omega*p*u)./u;
bps(theta+91)=20*log10(abs(w'*d));
end
bp(index,:)=bps;
index = index + 1;
end
% here you can
plot the BP as a function of DoA for any frequency.
% Implementing the Beamforming
start
= 1;
skiprate = nfft/2;
window = triang(nfft)';
num_samples = size(data,2); % data size
num_blocks = ceil((num_samples-nfft)/skiprate);
frame = 1:nfft;
data_frame = zeros(n_mic,nfft);
% frame of data ( from each mic)
data_fft
= zeros(nfft,n_mic); % FFT of the frame
s
= zeros(1,nfft); % frame data (time)
S =
zeros(1,(n_blocks+1)*nfft/2);
for m = 1 :
n_blocks
data_frame = data(:,frame);
data_fft = fft(data_frame');
s = sum(conj(W).*data_fft');
S(frame) = S(frame) + real(ifft(s.*window));
frame = frame + skiprate;
end[\code]