音声データからsignal duration,bandwidth,peak frequencyを抽出する方法

4 views (last 30 days)
Tomo
Tomo on 21 Jun 2022
Commented: Tomo on 22 Jun 2022
表題の件について,解決策をご存じの方がいらっしゃいましたら,ご回答いただけましたら幸いでございます.
以下,質問の詳細について述べさせていただきます.
現在,ある一つのパルス音のsignal duration,bandwidth,peak frequencyを抽出するために,以下のようなコードを書いています.
----------------------------------------------------------------------------------------------
wavファイルを読み込む
[wf, fs] = audioread(wavfile);
signal duration
n = length(wf);
sd = n./fs
帯域幅(‐3db)
bw = bandwidth(wf);
freq = [1:fs];
ピーク周波数
N=length(wf);
[freq_response,freq_index] = freqz(wf,1,N,fs); %N is the number of samples
pM = max(abs(freq_response)); %magnitude
pF = freq_index(abs(freq_response)==pM); %frequency
----------------------------------------------------------------------------------------------
おそらくpeak frequencyについては正しく出力できているのですが,signal durationとbandwidthのどちらか,あるいは両方が正しく出力されていないように思います.
理由は,出力された結果が「signal duration (ms) - bandwidth (kHz) × 2 = 0.002」という,一定の値になるからです.
例えば, bw=9554, sd=0.01911のようになり,「19.11 (ms) - 9.554 (kHz) × 2 = 0.002」といった具合です.
もし,コードのどこかに誤りがあるようでしたら,ご指摘いただければ幸いでございます.
また,そもそもsignal durationとbandwidthはこのような関係になるのか,あるいは,コードに誤りはなく,音声データに不具合があるのか,
といった点についても,ご教示いただけると幸いでございます.
お手数をおかけしますが,何卒よろしくお願いいたします.

Accepted Answer

Atsushi Ueno
Atsushi Ueno on 21 Jun 2022
nSamp = 50000; Fs = 8192;
x = chirp((0:nSamp-1)'/Fs,200,nSamp/Fs,2000); % 200Hz⇒2000Hz迄スイープした正弦波のサンプル音声データ
audiowrite('sample.wav',x,Fs); % サンプル音声ファイルの作成
[wf, fs] = audioread('sample.wav'); % サンプル音声ファイルの読込
>もし,コードのどこかに誤りがあるようでしたら,ご指摘いただければ幸いでございます.
MATLABのbandwidth関数の出力は「行列のバンド幅」で、「3 dB帯域幅」とは違います。
他のToolboxにもbandwidth関数がありますが (bandwidth / bandwidth) 必要な入力はモデル等の型でベクトルではありません。
bandwidth(wf)
ans = 49999
powerbw関数にベクトル(1ch)/行列(複数ch)を入力すると「3 dB帯域幅」が得られます。(要Signal Processing Toolbox)
powerbw(wf, fs)
ans = 1.7870e+03
signal duration [s] (音声データの長さ) は間違いないです。
sd = length(wf)./fs % signal duration
sd = 6.1035
audioinfo('sample.wav') % sdの値がDurationと一致している
ans = struct with fields:
Filename: '/users/mss.system.YODQA7/sample.wav' CompressionMethod: 'Uncompressed' NumChannels: 1 SampleRate: 8192 TotalSamples: 50000 Duration: 6.1035 Title: [] Comment: [] Artist: [] BitsPerSample: 16
>そもそもsignal durationとbandwidthはこのような関係になるのか
「音声データの長さ」と「3 dB帯域幅」には直接的な関連はありません。
「音声データの長さ」と「行列のバンド幅」は、サンプル数が増える程長くなりバンド幅も増える相関関係があります。
  1 Comment
Tomo
Tomo on 22 Jun 2022
ご丁寧に回答いただきまして,誠にありがとうございます.
解決いたしました.

Sign in to comment.

More Answers (0)

Community Treasure Hunt

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

Start Hunting!