Macierze mikrofonowe i głośnikowe
Autorzy: Daniel Król
Pliki: rozdzial_17.zip
Przykład 17.1
W przykładzie 17.1 (plik przyklad_17_1.m) przedstawiono program w języku MATLAB, który umożliwia wygenerowanie charakterystyk kierunkowych dla różnej liczby mikrofonów w macierzy na podstawie równania 17.1 oraz 17.4 (kod zakomentowany).% Przykład 17.1
%
% Cyfrowe przetwarzanie sygnałów. Podstawy, multimedia, transmisja. PWN, Warszawa, 2014.
% Rozdział 17. Macierze mikrofonowe i głośnikowe.
% Autor rozdziału: Daniel Król.
clear all; clc; % przygotowanie obliczeń
%------------------------ Parametry macierzy ------------------------------
v=340; % prędkość dźwięku [m/s]
l=0.05; % odległość mikrofonów [m]
N=8; % liczba mikrofonów
f=1000; % częstotliwość [Hz]
%--------------------------------------------------------------------------
m=1;
for theta=-pi:0.01:pi % zmiana kąta -pi do +pi
sum=0;
%re=0; im=0;
for k=0:N-1 % obliczenie czułości macierzy
sum=sum+exp(i*2*pi*f*k*l*sin(theta)/v); % na podstawie wzoru (17.1)
%re=re+cos(2*pi*f*k*l*sin(theta)/v); % na podstawie wzoru (17.4)
%im=im+sin(2*pi*f*k*l*sin(theta)/v); % na podstawie wzoru (17.4)
end
y(m)=(abs(sum/N)); % moduł/N - na podstawie wzoru (17.1)
%y(m)=sqrt(re*re+im*im)/N; % moduł/N - na podstawie wzoru (17.4)
m=m+1;
end
%--------------------------------------------------------------------------
ph=linspace(-pi,pi,m-1); % przestrzeń fazy dla wykresu
polar(ph,y,'b'); % wykres biegunowy
xlabel(['N=',num2str(N),', l=',num2str(l*100),'cm', ', f=',num2str(f/1000),'kHz']);
Przykład 17.2
W przykładzie 17.2 (plik przyklad_17_2.m) przedstawiono program w języku MATLAB, który umożliwia wygenerowanie szerokopasmowej charakterystyki kierunkowej dla różnej liczby mikrofonóww macierzy na podstawie wzoru 17.1.% Przykład 17.2
%
% Cyfrowe przetwarzanie sygnałów. Podstawy, multimedia, transmisja. PWN, Warszawa, 2014.
% Rozdział 17. Macierze mikrofonowe i głośnikowe.
% Autor rozdziału: Daniel Król.
clear all; clc; % przygotowanie obliczeń
%------------------------ Parametry macierzy ------------------------------
v=340; % prędkość dźwięku [m/s]
l=0.05; % odległość mikrofonów [m]
N=8; % liczba mikrofonów
fg=6000; % górna częstotliwość wykresu [Hz]
M=400; % rozdzielczość wykresu MxM
%------------------------ Obliczenia czułości -----------------------------
for m=1:M % zmiana częstotliwości
f(m)=m*fg/M; % wektor częstotliwości
for p=1:M % zmiana fazy
theta(p)=(pi*(p/M))-pi/2; % wektor fazy
sum=0;
for k=0:N-1 % obliczenie czułości macierzy
sum=sum+exp(i*2*pi*f(m)*k*l*sin(theta(p))/v);
end
y(m,p)=abs(sum/N); % moduł/N
end
end
%----------------------------- Wykres -------------------------------------
fr=linspace(0,fg,M); % przestrzeń częstotliwości dla wykresu
ph=linspace(-90,90,M); % przestrzeń fazy dla wykresu
%surf(ph,fr,y); % wykres 3D
pcolor(ph,fr,y); colorbar; % wykres 2D
shading interp; % cieniowanie wykresu
ylabel('Częstotliwość (Hz)'); xlabel('Faza (stopnie)'); zlabel('Amplituda');
title(['N=',num2str(N),', l=',num2str(l*100),'cm']); grid on;
Przykład 17.3
W przykładzie 17.3 (plik delay_sum.m) przedstawiono implementację w języku MATLAB algorytmu Delay-Sum.% Przykład 17.3
%
% Cyfrowe przetwarzanie sygnałów. Podstawy, multimedia, transmisja. PWN, Warszawa, 2014.
% Rozdział 17. Macierze mikrofonowe i głośnikowe.
% Autor rozdziału: Daniel Król.
function y=delay_sum(X, fp, l, theta)
%% y=delay_sum(X, fp, l, theta)
%
% X - wielokanałowy sygnał wejsciowy, fp - częstotliwość próbkowania
% l - odległość mikrofonów, theta - kąt wiązki
% y - sygnał wyjściowy
v=340; % prędkość dźwięku [m/s]
alfa=(theta*pi)/180; % stopnie/radiany
d=(l*sin(alfa))/v; % opóźnienie [s]
N=size(X,2); % liczba kanałów
%--------------------------------------------------------------------------
for k=1:N
shf(N-k+1)=floor((k-1)*abs(d)*fp); % wektor opóźnień
end
if(d<0) % transformacja dla
shf=fliplr(shf); % ujemnego kąta wiązki
end
%--------------------------------------------------------------------------
M=size(X,1); % liczba próbek w kanale
y1=zeros(M,1);
for k=1:N
y1(1+shf(k):M+shf(k),k)=X(1:M,k); % opóźnienia
end
s=ones(1,N)/N; % przygotowanie wektora sumującego
y=y1*s'; % suma opóźnionych kanałów / N
Przykład 17.4
W przykładzie 17.4 (plik filter_sum.m) przedstawiono implementację w języku MATLAB algorytmu Filter-Sum.% Przykład 17.4
%
% Cyfrowe przetwarzanie sygnałów. Podstawy, multimedia, transmisja. PWN, Warszawa, 2014.
% Rozdział 17. Macierze mikrofonowe i głośnikowe.
% Autor rozdziału: Daniel Król.
function y=filter_sum(X, fp, h, l, theta)
%% y=filter_sum(X, fp, h, l, theta)
%
% X - wielokanałowy sygnał wejściowy, fp - częstotliwość próbkowania
% h - wagi podfiltru, l - odległość mikrofonów, theta - kąt wiązki
% y - sygnał wyjściowy
v=340; % prędkość dźwięku
alfa=(theta*pi)/180; % stopnie/radiany
d=(l*sin(alfa))/v; % opóźnienie [s]
N=size(X,2); % liczba kanałów
%------------------------------------------------------------
for k=1:N
shf(N-k+1)=floor((k-1)*abs(d)*fp); % wektor opóźnień
end
if(d<0) % transformacja dla
shf=fliplr(shf); % ujemnego kąta wiązki
end
%------------------------------------------------------------
ws=size(h,2); % długość podfiltru
dmax=floor(fp*(((k-1)*l)/v)); % max opóźnienie w macierzy mikrofonowej
Mf=dmax+ws; % długość filtru FIR
H=zeros(Mf,N); % macierz wag filtrów FIR
for k=1:N
H(shf(k)+1:shf(k)+ws,k)=h; % opóźnienia
end
%------------------------------------------------------------
for k=1:N
y1(:,k)=filter(H(:,k),1,X(:,k)); % filtracja kanałów
end
s=ones(1,N)/N; % przygotowanie wektora sumującego
y=y1*s'; % suma filtrowanych kanałów / N
Przykład 17.5
W przykładzie 17.5 (plik gcc_phat.m) przedstawiono implementację w języku MATLAB funkcji GCC-PHAT.% Przykład 17.5 % % Cyfrowe przetwarzanie sygnałów. Podstawy, multimedia, transmisja. PWN, Warszawa, 2014. % Rozdział 17. Macierze mikrofonowe i głośnikowe. % Autor rozdziału: Daniel Król. function y=gcc_phat(x1, x2) %% y=gcc_phat(x1, x2) % % x1, x2 - sygnały wejściowe % y - wyjście GCC-PHAT NFFT = 2*(size(x1,1))-1; % obliczenie długości FFT G1=fft(x1,NFFT); % widmo X1(f) G2=fft(x2,NFFT); % widmo X2(f) G12=G1.*conj(G2); % iloczyn X1(f)X2(f)* den=max(abs(G12),1e-6); % moduł |X1(f)X2(f)*| G=G12./den; % X1(f)X2(f)*/|X1(f)X2(f)*| g=real(ifft(G)); % transformacja w dziedzinę czasu y=fftshift(g);
Przykład 17.6
W przykładzie 17.6 (plik tdoa.m) przedstawiono implementację w języku MATLAB funkcji realizującej metodę TDOA dla kilku źródeł dźwięku.% Przykład 17.6
%
% Cyfrowe przetwarzanie sygnałów. Podstawy, multimedia, transmisja. PWN, Warszawa, 2014.
% Rozdział 17. Macierze mikrofonowe i głośnikowe.
% Autor rozdziału: Daniel Król.
function theta=tdoa(x1, x2, fp, l, M)
%% theta=tdoa(x1, x2, fp, l, M)
%
% x1, x2 - sygnały wejściowe, fp - częstotliwość próbkowania
% l - odległość mikrofonów, M - liczba źródeł dźwięku
v=340; % prędkość dźwięku [m/s]
xx=gcc_phat(x1,x2); % korelacja GCC-PHAT
[val,i]=sort(xx,'descend'); % sortowanie M-maksimów
S=size(x1,1); % długość sygnału
for k=1:M % iteracja po źródłach dźwięku
shf=S-i(k); % obliczenie kąta wiązki
d=shf/fp;
alfa=asin((d*v)/(l));
theta(k)=alfa*180/pi;
end
Przykład 17.7
W przykładzie 17.7 (plik przyklad_17_7.m) przedstawiono program w języku MATLAB, który umożliwia śledzenie źródła dźwięku z wykorzystaniem metody TDOA.% Przykład 17.7
%
% Cyfrowe przetwarzanie sygnałów. Podstawy, multimedia, transmisja. PWN, Warszawa, 2014.
% Rozdział 17. Macierze mikrofonowe i głośnikowe.
% Autor rozdziału: Daniel Król.
clear all; clc;
l=0.08; % odległość mikrofonów w macierzy
k=3; % kanał do obliczenia TDOA względem kanału 1
[X, fp] = wavread('mch_truck.wav'); % odczyt pliku
NFFT=16384; % rozmiar okna FFT
K=size(X,1); % liczba próbek w pojedynczym kanale
wn = window(@hann,NFFT); % okno dla FFT
j=1;
for(i=0:(NFFT/2):K-NFFT) % przesuwanie okna z zakładką 1/2 długości okna
XW(1:NFFT,:)=X(i+1:i+NFFT,:); % wycinek sygnału o długości okna
xw1=wn.*XW(:,1); % przemnożenie 1 kanału przez okno (wn)
xw2=wn.*XW(:,1+k); % przemnożenie k-tego kanału przez okno (wn)
theta(j)=tdoa(xw1, xw2, fp, k*l, 1);% obliczenie TDOA dla 1 źródła sygnału
j=j+1;
end
tm=linspace(0,j*(NFFT/2)/fp,j-1); % przestrzeń czasu
plot(tm, theta,'b*-');
xlabel(['Czas (s)']); ylabel(['Kąt (stopnie)']); grid on;
Przykład 17.8
W przykładzie 17.8 (plik przyklad_17_8.m) przedstawiono implementację w języku MATLAB wykorzystania algorytmu Filter-Sum do poprawy SNR.% Przykład 17.8
%
% Cyfrowe przetwarzanie sygnałów. Podstawy, multimedia, transmisja. PWN, Warszawa, 2014.
% Rozdział 17. Macierze mikrofonowe i głośnikowe.
% Autor rozdziału: Daniel Król.
clear all; clc; % przygotowanie obliczeń
%------------------------ Parametry macierzy ------------------------------
l=0.02; % odległość mikrofonów w macierzy
%theta=30; % kąt wiązki (-90 - +90)
%--------------------------------------------------------------------------
[X, fp] = wavread('mch_noise.wav');
%------------------------------ TDOA --------------------------------------
N=size(X,2); % liczba kanałów
theta=tdoa(X(:,1), X(:,N), fp, (N-1)*l, 1) % obliczenie kąta na podstawie TDOA
%---------------------- Narrowband Beamforming ----------------------------
%wagi filtru pasmowo-przepustowego (Hamming 10rząd 2kHz-16kHz)
hnb=[-0.00965926 0 -0.0309026 -0.153538 0.18252 0.603916 0.18252 -0.153538 -0.0309026 0 -0.00965926];
%----------------------- Broadband Beamforming ----------------------------
%wagi dla delay-sum [1 0 0 0 ...]
hbb=[1];
%--------------------------------------------------------------------------
fsum=filter_sum(X, fp, hnb, l, theta); % filter-sum
%fsum=delay_sum(X, fp, l, theta); % delay-sum
%--------------------------- Spektrogram ----------------------------------
amin=1000; % dynamika spektrogramu
[C,f,t]=specgram(X(:,1),1024,fp,256,192); % pojedynczy kanał
subplot(2,1,1);
bmin=max(max(abs(C)))/amin;
imagesc(t,f,20*log10(max(abs(C),bmin)/bmin));
axis xy; xlabel('Czas (s)'); ylabel('Częstotliwość (Hz)'); colorbar;
[C,f,t]=specgram(fsum,1024,fp,256,192); % wyjście filter-sum
subplot(2,1,2);
bmin=max(max(abs(C)))/amin;
imagesc(t,f,20*log10(max(abs(C),bmin)/bmin));
axis xy; xlabel('Czas (s)'); ylabel('Częstotliwość (Hz)'); colorbar;
%--------------------------------------------------------------------------
wavwrite(fsum, fp, 'fs_noise.wav'); % zapis wyjścia do pliku
sound(fsum, fp); % odtwarzanie wyjścia
Przykład 17.9
W przykładzie 17.9 (plik przyklad_17_9.m) przedstawiono implementację w języku MATLAB wykorzystania algorytmu Filter-Sum do separacji źródeł dźwięku.% Przykład 17.9
%
% Cyfrowe przetwarzanie sygnałów. Podstawy, multimedia, transmisja. PWN, Warszawa, 2014.
% Rozdział 17. Macierze mikrofonowe i głośnikowe.
% Autor rozdziału: Daniel Król.
clear all; clc; % przygotowanie obliczeń
%------------------------ Parametry macierzy ------------------------------
l=0.02; % odległość mikrofonów w macierzy
%thetaA=30; % kąt wiązki A (-90 - +90)
%thetaB=0; % kąt wiązki B (-90 - +90)
%thetaC=-45; % kąt wiązki C (-90 - +90)
%--------------------------------------------------------------------------
[X, fp] = wavread('mch_separation.wav');
%------------------------------ TDOA --------------------------------------
N=size(X,2); % liczba kanałów w pliku
theta=tdoa(X(:,1), X(:,N), fp, (N-1)*l, 3); % obliczenie 3 kątów na podstawie TDOA
thetaA=theta(1)
thetaB=theta(2)
thetaC=theta(3)
%----------------------- Narrowband Beamforming ---------------------------
%wagi filtru pasmowo-przepustowego (Hamming 10rzad 2kHz-16kHz)
hnb=[-0.00965926 0 -0.0309026 -0.153538 0.18252 0.603916 0.18252 -0.153538 -0.0309026 0 -0.00965926];
%----------------------- Broadband Beamforming ----------------------------
%wagi dla delay-sum [1 0 0 0 ...]
hbb=[1];
%--------------------------------------------------------------------------
fsum1=filter_sum(X, fp, hnb, l, thetaA);
fsum2=filter_sum(X, fp, hnb, l, thetaB);
fsum3=filter_sum(X, fp, hnb, l, thetaC);
%--------------------------- Spektrogram ----------------------------------
amin=1000; % dynamika spektrogramu
[C,f,t]=specgram(X(:,1),1024,fp,256,192); % pojedynczy kanał
subplot(2,2,1);
bmin=max(max(abs(C)))/amin;
imagesc(t,f,20*log10(max(abs(C),bmin)/bmin));
axis xy; xlabel('Czas (s)'); ylabel('Częstotliwość (Hz)'); colorbar;
[C,f,t]=specgram(fsum1,1024,fp,256,192); % wyjście filter-sum 1
subplot(2,2,2);
bmin=max(max(abs(C)))/amin;
imagesc(t,f,20*log10(max(abs(C),bmin)/bmin));
axis xy; xlabel('Czas (s)'); ylabel('Częstotliwość (Hz)'); colorbar;
[C,f,t]=specgram(fsum2,1024,fp,256,192); % wyjście filter-sum 2
subplot(2,2,3);
bmin=max(max(abs(C)))/amin;
imagesc(t,f,20*log10(max(abs(C),bmin)/bmin));
axis xy; xlabel('Czas (s)'); ylabel('Częstotliwość (Hz)'); colorbar;
[C,f,t]=specgram(fsum3,1024,fp,256,192); % wyjście filter-sum 3
subplot(2,2,4);
bmin=max(max(abs(C)))/amin;
imagesc(t,f,20*log10(max(abs(C),bmin)/bmin));
axis xy; xlabel('Czas (s)'); ylabel('Częstotliwość (Hz)'); colorbar;
%--------------------------------------------------------------------------
wavwrite(fsum1, fp, 'fs_1.wav'); % zapis wyjscia 1 do pliku
wavwrite(fsum2, fp, 'fs_2.wav'); % zapis wyjscia 2 do pliku
wavwrite(fsum3, fp, 'fs_3.wav'); % zapis wyjscia 3 do pliku
sound(fsum1, fp); % odtwarzanie wyjscia 1
sound(fsum2, fp); % odtwarzanie wyjscia 2
sound(fsum3, fp); % odtwarzanie wyjscia 3
Przykład 17.10
W przykładzie 17.10 (plik delay_speaker.m) przedstawiono implementację w języku MATLAB funkcji sterującej wiązką w macierzy głośnikowej.% Przykład 17.10
%
% Cyfrowe przetwarzanie sygnałów. Podstawy, multimedia, transmisja. PWN, Warszawa, 2014.
% Rozdział 17. Macierze mikrofonowe i głośnikowe.
% Autor rozdziału: Daniel Król.
function Y=delay_speaker(x, fp, N, l, theta)
%% Y=delay_speaker(x, fp, N, l, theta)
%
% x - sygnał wejściowy, fp - częstotliwość próbkowania
% N - liczba kanałów, l - odległość głośników, theta - kąt wiązki
% Y - wielokanałowy sygnał wyjściowy
v=340; % prędkość dźwięku
alfa=(theta*pi)/180; % stopnie/radiany
d=(l*sin(alfa))/v; % opóźnienie [s]
M=size(x,1); % liczba próbek w kanale
for k=1:N
shf(k)=floor((k-1)*abs(d)*fp); % wektor opóźnień dla
end % głośników
if(d<0) % transformacja dla
shf=fliplr(shf); % ujemnego kąta wiązki
end
Y = zeros(M,N);
for k=1:N % wiązka sterowana
Y(1+shf(k):M,k)=x(1:M-shf(k));
end
Przykład 17.11
W przykładzie 17.11 (plik przyklad_17_11.m) przedstawiono implementację w języku MATLAB algorytmu dla macierzy głośnikowej z trzema niezależnymi wiązkami sterowanymi.% Przykład 17.11
%
% Cyfrowe przetwarzanie sygnałów. Podstawy, multimedia, transmisja. PWN, Warszawa, 2014.
% Rozdział 17. Macierze mikrofonowe i głośnikowe.
% Autor rozdziału: Daniel Król.
clear; clc; % przygotowanie obliczeń
%------------------------ Parametry macierzy ------------------------------
l=0.02; % odległość głośników
N=16; % liczba kanałów
thetaA=30; % kąt wiązki A (-90 - +90)
thetaB=0; % kąt wiązki B (-90 - +90)
thetaC=-45; % kąt wiązki C (-90 - +90)
%------------------------ Sygnały wejściowe -------------------------------
[x0, fp] = wavread('bird1.wav'); % sygnał A
[x1, fp] = wavread('bird2.wav'); % sygnał B
[x2, fp] = wavread('bird3.wav'); % sygnał C
%----------------------- Generowanie wiązek -------------------------------
Y0=delay_speaker(x0, fp, N, l, thetaA);
Y1=delay_speaker(x1, fp, N, l, thetaB);
Y2=delay_speaker(x2, fp, N, l, thetaC);
%--------------------------------------------------------------------------
Y=(Y0+Y1+Y2)/3; % znormalizowana suma wiązek
wavwrite(Y, fp, 'mch_separation.wav'); % zapis wyjścia