MATLAB Answers

指向性をもったスピー​カの音圧分布のプロッ​トについて

13 views (last 30 days)
現在自分はアクティブノイズコントロールについての研究を行おうと思っており、研究をおこなうに当たって、自由音場において適当に配置した無数のスピーカがどのような音場を作るのか(自分もこの分野に対しての知識がまだ浅いためこの言い方が正しいかはわかりませんが)というものをシミュレーション上で見れないかということを模索しています。理想は3次元で音圧分布が可視化できればと思っています。難しければ2次元でも構いません。
現在自分で行ったこととしては、とある書籍で進行波の音圧の複素実効値が以下の式であらわせるというものをみてこの式をもとに計算結果をプロットしてみました。
kが波数、ρが密度(自分が再現しようとしている音場では空気の密度だと思っています)
Aが適当な定数、rが音源からの距離です。
この式を使いプロットを行うことで、点音源が自由音場においてどのような音圧分布を作るかということは可視化することができたのですが、ここから一般的なスピーカのようにある程度の指向性を持たせる方法が分からず困っています。今の使用している式では距離でのみ音圧が決まると思うのですが、そうではなく、スピーカの正面は音圧が高く、後ろ側は音圧が低いというようなものを作成したいと思っています。
MATLAB上でそのような物理的なシミュレーションを行うことは可能でしょうか?
参考までに現在作成しているプログラムを載せておきます
function a = Three_dimention_soundsource_monopole(f,max,interval,min)
% 定数定義
w = 2*pi*f;
lambda = 340/f;
k = 2*pi/lambda;
p = 1.293;
c = 340
A = 1/k^2*p*c
% 計算部
[X,Y,Z] = meshgrid(min:interval:max);
x1 = X;
y1 = Y - max/2;
z1 = Z;
x2 = X - max/2;
y2 = Y ;
z2 = Z ;
x3 = X + max/2;
y3 = Y ;
z3 = Z ;
x4 = X ;
y4 = Y + max/2
z4 = Z ;
x5 = X - max/(2*sqrt(2));
y5 = Y - max/(2*sqrt(2));
z5 = Z ;
x6 = X + max/(2*sqrt(2));
y6 = Y + max/(2*sqrt(2));
z6 = Z ;
x7 = X + max/(2*sqrt(2));
y7 = Y - max/(2*sqrt(2));
z7 = Z ;
x8 = X - max/(2*sqrt(2));
y8 = Y + max/(2*sqrt(2));
z8 = Z ;
soundsorce1 = 1i*w*p*A/sqrt(x1.^2+y1.^2+z1.^2).*exp(-1i*k*sqrt(x1.^2+y1.^2+z1.^2));
soundsorce2 = 1i*w*p*A/sqrt(x2.^2+y2.^2+z2.^2).*exp(-1i*k*sqrt(x2.^2+y2.^2+z2.^2));
soundsorce3 = 1i*w*p*A/sqrt(x3.^2+y3.^2+z3.^2).*exp(-1i*k*sqrt(x3.^2+y3.^2+z3.^2));
soundsorce4 = 1i*w*p*A/sqrt(x4.^2+y4.^2+z4.^2).*exp(-1i*k*sqrt(x4.^2+y4.^2+z4.^2));
soundsorce5 = 1i*w*p*A/sqrt(x5.^2+y5.^2+z5.^2).*exp(-1i*k*sqrt(x5.^2+y5.^2+z5.^2));
soundsorce6 = 1i*w*p*A/sqrt(x6.^2+y6.^2+z6.^2).*exp(-1i*k*sqrt(x6.^2+y6.^2+z6.^2));
soundsorce7 = 1i*w*p*A/sqrt(x7.^2+y7.^2+z7.^2).*exp(-1i*k*sqrt(x7.^2+y7.^2+z7.^2));
soundsorce8 = 1i*w*p*A/sqrt(x8.^2+y8.^2+z8.^2).*exp(-1i*k*sqrt(x8.^2+y8.^2+z8.^2));
anser = abs(soundsorce1 + soundsorce2 + soundsorce3 + soundsorce4 + soundsorce5 + soundsorce6 + soundsorce7 + soundsorce8);
xslice = 0;
yslice = [];
zslice = 0;
% プロット部
slice(X,Y,Z,anser,xslice,yslice,zslice)
title('3次元空間の音圧分布')
xlabel('x[m]')
ylabel('y[m]')
zlabel('z[m]')
c = colorbar;

Accepted Answer

Shunichi Kusano
Shunichi Kusano on 30 May 2020
Edited: Shunichi Kusano on 30 May 2020
簡単のため、音源が原点にあるとしまして、音が最大になる向き(スピーカーの正面方向:以下p1)を決めれば、任意の単位ベクトルp2とのなす角は、内積から計算できますので、あとは角度に対して、指向性がどうなるのかという関数を決めてあげれば、指向性を実装できます。
例えばx方向にcos関数で指向性を与える場合、
p1 = [1 0 0];
[X,Y,Z] = meshgrid([-1:0.01:1],[-1:0.01:1],[-1:0.01:1]);
p2 = [X(:),Y(:),Z(:)];
p2 = normalize(p2, 2, 'norm'); % 単位ベクトルに
theta = reshape(acos(p2*p1.'), size(X)); % 各グリッド上で、p1とのなす角
directivity = cos(theta); % 指向性の関数
directivity(directivity < 0) = 0; % 後ろ側はゼロ
% 確認のため表示
slice([-1:0.01:1],[-1:0.01:1],[-1:0.01:1],directivity, [0.3 0.6 1],[0],[0])
shading flat
directivityをsoundsourceに要素ごとに掛ければ指向性を含んだ音圧表現になるかと思います。
  3 Comments
kaiho inoue
kaiho inoue on 1 Jun 2020
丁寧なご説明ありがとうございます、、、!!
指向性の関数についてはまた自分でも検討してみたいと思います。
ありがとうございました

Sign in to comment.

More Answers (0)

Tags

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!