バンドパスフィルター後の音圧測定について

23 views (last 30 days)
Tomo
Tomo on 4 Oct 2022
Commented: Tomo on 4 Oct 2022
特定の周波数帯域のみの音圧を測定するために,バンドパスフィルターをかけ,音圧(RMS値)を算出しています.
以下に,コードを記します.
--------------------------------------------
[y, fs] = audioread('demo.wav');
cal = 176.8; %絶対音圧に補正するためのキャリブレーション値
calin = 10.^(abs(cal)/20); %絶対音圧に補正するための式
data_row = y*calin; %絶対音圧に補正
bandpass(data_row, [80000 120000], fs); %作図
[p, f] = bandpass(data_row, [80000 120000], fs);
pdata_bp = abs(p).^2;
RMS_bp = 10*log10(sum(pdata_bp)/length(pdata_bp));
table(RMS_bp)
--------------------------------------------
〈ご質問〉
bandpass関数を用いた作図の音圧(60 dB程度)と,RMSの音圧(RMS_bp)(82.9 dB)の値が大きく異なってしまいます.
解析に用いた音データと,作図の結果を添付いたします.
なぜこのような違いが生じてしまうのか,ご存じの方がいらっしゃいましたら,ご教示いただけますと幸いです.
また,どこをどのように修正するべきか,ご教示いただきたく存じます.
よろしくお願いいたします.

Accepted Answer

Hernia Baby
Hernia Baby on 4 Oct 2022
見ているものが違うからです。
@Tomoさんが見ているのは合計値すなわちOverAllです。
これは全ての周波数帯におけるパワーを合算した数値です。
clear,clc;
load('demo.mat')
cal = 176.8; %絶対音圧に補正するためのキャリブレーション値
calin = 10.^(abs(cal)/20); %絶対音圧に補正するための式
data_row = y*calin; %絶対音圧に補正
bandpass(data_row, [80000 120000], fs); %作図
バンドパスをかけたものを見てみましょう。
[p, f] = bandpass(data_row, [80000 120000], fs);
% pdata_bp = abs(p).^2;
% RMS_bp = 10*log10(sum(pdata_bp)/length(pdata_bp));
RMS_bp = 10*log10(rms(p).^2);
table(RMS_bp)
ans = table
RMS_bp ______ 82.901
ここで、RMS_bpはOverAllです。
----
周波数帯での結果をpspectrumで確認します。
[pp0,ff0] = pspectrum(data_row,fs,"Leakage",0.85);
[pp,ff] = pspectrum(p,fs,"Leakage",0.85);
figure
plot(ff0./1e3,10*log10(pp0),ff./1e3,10*log10(pp))
grid on
legend({"original","Filtered"})
ylim([0 120])
音圧が異なっていないことがわかりました。
  4 Comments
Hernia Baby
Hernia Baby on 4 Oct 2022
@Tomoさん、返信ありがとうございます。
今回された操作は80k~120kHzのバンドパスフィルタをかけた時系列データのRMS値をパワーで算出しています。なのでRMS_bpがこの周波数帯でのRMS値(の二乗をレベルにしたもの)になります。
区間を指定した Over All は Partial Over All (P.O.A)と呼ばれます。
単にこの周波数帯の実効値を求めたい場合はrmsをつけるだけでオッケーです。
clear,clc;
load('demo.mat')
cal = 176.8; % 絶対音圧に補正するためのキャリブレーション値
calin = 10.^(abs(cal)/20); % 絶対音圧に補正するための式
data_row = y*calin; % 絶対音圧に補正
[p, f] = bandpass(data_row, [80000 120000], fs); % バンドパスフィルタ
RMS_bp = 10*log10(rms(p).^2) % P.O.A(レベル)
RMS_bp = 82.9013
figure
plot(p)
hold on
yline(rms(p),'k:')
legend({'フィルタ済み信号','実効値(RMS値)'})
Tomo
Tomo on 4 Oct 2022
ご親切にご回答いただきまして,ありがとうございました.
理解いたしました.ありがとうございました.

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!