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

6 ビュー (過去 30 日間)
Tomo
Tomo 2022 年 6 月 21 日
コメント済み: Tomo 2022 年 6 月 22 日
表題の件について,解決策をご存じの方がいらっしゃいましたら,ご回答いただけましたら幸いでございます.
以下,質問の詳細について述べさせていただきます.
現在,ある一つのパルス音の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はこのような関係になるのか,あるいは,コードに誤りはなく,音声データに不具合があるのか,
といった点についても,ご教示いただけると幸いでございます.
お手数をおかけしますが,何卒よろしくお願いいたします.

採用された回答

Atsushi Ueno
Atsushi Ueno 2022 年 6 月 21 日
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 件のコメント
Tomo
Tomo 2022 年 6 月 22 日
ご丁寧に回答いただきまして,誠にありがとうございます.
解決いたしました.

サインインしてコメントする。

その他の回答 (0 件)

Community Treasure Hunt

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

Start Hunting!