スペクトログラム画像を逐次保存したい。

こんにちは。
音声データをスペクトログラムに変換、そのスペクトログラム画像をプログラム内で逐次保存したいと考えております。
1~3までの.wavデータを用意して行っています。
スペクトログラムを表示するところまではできているのですが、エラーが出て保存することができない状況です。
スペクトログラムを1.png,2.png...のような名前で逐次保存できるようにするにはどのようにしたら良いでしょうか。
また、この状態でスペクトログラム画像を表示すると画像が正方形で表示されてしまうため、特徴量が見やすいよう横長方形での保存ができるとありがたいです。
ご教授願います。
for b=1:3
%ファイルの名前は数字 1.wav,2.wav,...
filename =char(b+".wav");
%data=音声データ:Fsサンプリング周波数
[data,Fs] = audioread(filename);
%周波数を指定
f=0:31.25:8000;
%データ長を指定
data(160040:length(data))=[];
%音声データをスペクトログラムデータに変換(spdata)
[spdata,f,t]=spectrogram(data, hann(64), 32, f, Fs, 'yaxis');
%スペクトログラムを表示(圧縮)
figure(b)
spectrogram(data, hamming(64), 32, f, Fs, 'yaxis');
%スペクトログラム画像の保存
imwrite(figure(b),'.png');
end

 Accepted Answer

Atsushi Ueno
Atsushi Ueno on 14 May 2021

0 votes

saveas関数を使わない理由はありますか?なければ最後に開いたfigureをsaveas関数でファイルに保存できます。
filename =char(b+".png");
saveas(gcf, filename)

3 Comments

Inagaki takeshi
Inagaki takeshi on 14 May 2021
saveas関数にコードを変更したところ無事保存できました!。ありがとうございます。
図々しいのは承知の上なのですが、上記のような出力で、画像を横長の長方形などに変換する方法はご存知でしょうか。
現在の出力では圧縮された正方形の画像が出てしまいます。
Atsushi Ueno
Atsushi Ueno on 14 May 2021
>出力引数なしで spectrogram(___) を使用すると、現在の Figure ウィンドウにスペクトルグラムがプロットされます。
なので、Figure ウィンドウサイズを変えればスペクトログラムのサイズも変わる事を期待して:
fg1 = figure('Name', ['figure' num2str(b)], 'position', [400 250 1120 420]); %位置は適当、幅:高さ=8:3
spectrogram(data, hamming(64), 32, f, Fs, 'yaxis');
saveas(fg1, char(b+".png")); %スペクトログラム画像の保存
close(fg1); % 閉じなくても良いが、開いたままfigureハンドルが破棄される
上記の「'position',[400 250 1120 420]」の設定により横長の画像が保存されると思います。
Signal Processing Toolboxが無いのでspectrogramをplotに置き換えて動作確認しました。
※都合によりfigureハンドルを追加したり、figureのNumberの代わりにNameを設定したりしています。
※新しいリリースではより高度な関数が使えますが、動作確認出来ないので他者の回答に期待します。
Inagaki takeshi
Inagaki takeshi on 17 May 2021
ご回答ありがとうございます!
コードを参考にこちらでも試してみたところ、正常に横長の画像が保存されました。
返信が遅くなり申し訳ございませんでした。ありがとうございました!。

Sign in to comment.

More Answers (0)

Categories

Products

Release

R2021a

Community Treasure Hunt

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

Start Hunting!