音声データからsignal duration,bandwidth,peak frequencyを抽出する方法
9 次查看(过去 30 天)
显示 更早的评论
表題の件について,解決策をご存じの方がいらっしゃいましたら,ご回答いただけましたら幸いでございます.
以下,質問の詳細について述べさせていただきます.
現在,ある一つのパルス音の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 个评论
采纳的回答
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'); % サンプル音声ファイルの読込
>もし,コードのどこかに誤りがあるようでしたら,ご指摘いただければ幸いでございます.
bandwidth(wf)
powerbw(wf, fs)
signal duration [s] (音声データの長さ) は間違いないです。
sd = length(wf)./fs % signal duration
audioinfo('sample.wav') % sdの値がDurationと一致している
>そもそもsignal durationとbandwidthはこのような関係になるのか
「音声データの長さ」と「3 dB帯域幅」には直接的な関連はありません。
「音声データの長さ」と「行列のバンド幅」は、サンプル数が増える程長くなりバンド幅も増える相関関係があります。
更多回答(0 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Measurements and Spatial Audio 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!