音声データからsignal duration,bandwidth,peak frequencyを抽出する方法
9 views (last 30 days)
Show older comments
表題の件について,解決策をご存じの方がいらっしゃいましたら,ご回答いただけましたら幸いでございます.
以下,質問の詳細について述べさせていただきます.
現在,ある一つのパルス音の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はこのような関係になるのか,あるいは,コードに誤りはなく,音声データに不具合があるのか,
といった点についても,ご教示いただけると幸いでございます.
お手数をおかけしますが,何卒よろしくお願いいたします.
0 Comments
Accepted Answer
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'); % サンプル音声ファイルの読込
>もし,コードのどこかに誤りがあるようでしたら,ご指摘いただければ幸いでございます.
bandwidth(wf)
powerbw(wf, fs)
signal duration [s] (音声データの長さ) は間違いないです。
sd = length(wf)./fs % signal duration
audioinfo('sample.wav') % sdの値がDurationと一致している
>そもそもsignal durationとbandwidthはこのような関係になるのか
「音声データの長さ」と「3 dB帯域幅」には直接的な関連はありません。
「音声データの長さ」と「行列のバンド幅」は、サンプル数が増える程長くなりバンド幅も増える相関関係があります。
More Answers (0)
See Also
Categories
Find more on Measurements and Spatial Audio in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!