質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

1504閲覧

【Python】スペクトログラムの表示がされない範囲がある

NUME

総合スコア0

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/05/30 08:34

編集2022/05/30 09:30

波形に対して短時間フーリエ変換をおこない、スペクトログラム化したのですが
画像のx軸の最小範囲と最大範囲で白く表示されており
画像化できていませんでした。

この原因がわかりませんので、どなたかわかる方いらっしゃいましたら
ご教授いただけると幸いです。
イメージ説明

コード等は下記のサイトを参考にさせていただきました。
https://friedrice-mushroom.hatenablog.com/entry/2019/08/31/113915

fs=1000 # kHz s_length=5 # second x = np.arange(0, s_length, 1/fs) #サンプリング周波数 1kHz、5秒の信号を想定 y=np.sin(np.pi*x**2*30)*np.sin(np.pi*x*1)+np.random.randn(s_length*fs)*0.01 #0~5秒で周波数が0〜150Hzにスウィープする関数。ホワイトノイズも付与。 fig =plt.figure(figsize=(8,5)) NFFT = 1024 # the length of the windowing segments Fs = fs # the sampling frequency plt.specgram(y,NFFT=NFFT, Fs=Fs, noverlap=1000,cmap='jet',scale='linear') plt.grid(linestyle='--', linewidth=0.5) plt.title("spectrogram(FFT)") plt.xlabel("Time[ms]") plt.ylabel("Frequency[kHz]") plt.colorbar(orientation='vertical') plt.xlim([0,5]) plt.ylim([0,200]) fig.tight_layout()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jbpb0

2022/05/31 23:54 編集

https://jp.mathworks.com/help/signal/ref/stft.html#mw_f6bebd3d-2957-47ad-94bc-6982eed99a32_sep_mw_c056db1e-cade-47af-bf56-37cd76eee5db の「詳細」の「短時間フーリエ変換」の最後の、「STFT の振幅二乗では、関数のパワー スペクトル密度の spectrogram 表現が得られます。」と書かれてるところの下の図を見てください 元データ「x(n)」から切り出した「x1(n)」等から計算しますが、一番先頭(左)の「x1(n)」から計算した結果は「x1(n)」の真ん中の時刻の結果で、それよりも早い時刻の結果はありません 「x1(n)」の真ん中の時刻は、「x1(n)」のデータサイズが「M」なので、元データ「x(n)」の先頭から「M/2」番目あたりのところです 質問のコードでは「NFFT = 1024」なので、元データの先頭から1024/2=512番目あたりのデータの時刻が、一番先頭(左)の結果の時刻です 「fs=1000」から、元データの先頭から512番目のデータの時刻は512/1000≒0.5秒で、それよりも早い時刻の結果はありません データの最後も、基本的には同様です ただし、元データから切り出した最後のデータ(最初の図での「x6(n)」)の最後と元データの最後が一致しない場合は、その分さらに結果が無い時間が長くなります
NUME

2022/06/01 05:32

ご教授いただきありがとうございます。 なるほど! では、0秒~約1秒の結果が0.5秒あたりの時刻に表示されているだけで、 0.5秒以前の処理されたデータが表示されていない訳ではないということですよね。
guest

回答1

0

stft
の「詳細」の「短時間フーリエ変換」の最後の、「STFT の振幅二乗では、関数のパワー スペクトル密度の spectrogram 表現が得られます。」と書かれてるところの下の図を見てください

元データ「x(n)」から切り出した「x1(n)」等から計算しますが、一番先頭(左)の「x1(n)」から計算した結果は「x1(n)」の真ん中の時刻の結果で、それよりも早い時刻の結果はありません

「x1(n)」の真ん中の時刻は、「x1(n)」のデータサイズが「M」なので、元データ「x(n)」の先頭から「M/2」番目あたりのところです

 
質問のコードでは「NFFT = 1024」なので、元データの先頭から1024/2=512番目あたりのデータの時刻が、一番先頭(左)の結果の時刻です

「fs=1000」から、元データの先頭から512番目のデータの時刻は512/1000≒0.5秒で、それよりも早い時刻の結果はありません

 
データの最後も、基本的には同様です
ただし、元データから切り出した最後のデータ(最初の図での「x6(n)」)の最後と元データの最後が一致しない場合は、その分さらに結果が無い時間が長くなります

投稿2022/07/29 08:12

jbpb0

総合スコア7658

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問