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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

JupyterLab

JupyterLabは、Jupyter notebookの後継の対話型開発環境(IDE)です。データの可視化がインタラクティブで、プラグイン作成により新しいコンポーネントの追加および既存のコンポーネントも統合可能。サーバに閉じているため、データ分析に向いています。

Python

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

Q&A

解決済

1回答

2081閲覧

Pythonでスペクトログラムを描きたいがうまく表示されていない

NMKN

総合スコア8

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

JupyterLab

JupyterLabは、Jupyter notebookの後継の対話型開発環境(IDE)です。データの可視化がインタラクティブで、プラグイン作成により新しいコンポーネントの追加および既存のコンポーネントも統合可能。サーバに閉じているため、データ分析に向いています。

Python

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

0グッド

0クリップ

投稿2022/10/31 04:59

編集2022/10/31 07:35

前提

ただいまデータの解析を行なっています。FFTなど行なっており別の状態も確認したいと考え、スペクトログラムを描こうとしています。以前にスペクトログラムを描くコードは作ったのでそれを流用したのですがうまくいきません。

実現したいこと

スペクトログラムを描く。
なぜこのような問題が起こっているのか特定する。

発生している問題・エラーメッセージ

スペクトログラムがうまく表示されない

該当のソースコード

Python

1import matplotlib.pyplot as plt 2import csv 3import pandas as pd 4import numpy as np 5from scipy import signal #スペクトログラム 6 7df=pd.read_csv('csv in/co2RV= 4.10951e+00.csv') 8df 9 10t = df["time"] 11n = df["nel"] 12 13plt.close("all") 14fs = 2e5 #サンプリング周波数 15print(fs,"[Hz]") 16 17f,t,Sxx = signal.spectrogram(n, fs, nperseg = 256) #数値積分の結果, サンプリング周波数, 切り出す幅の長さ(値が大きいと, 時間の分解能は下がるが, 周波数の分解能は上がる) 18plt.figure() 19plt.pcolormesh(t,f,10*np.log(Sxx)) #時刻, 周波数, dB値を表示 20plt.xlim([3.3, 5.8]) 21plt.xlabel("Time [sec]") 22plt.ylabel("Frequency [Hz]") 23 24""" 25cbar = plt.colorbar() #カラーバー表示のため追加 26cbar.ax.set_ylabel("Intensity [dB]") #カラーバーの名称表示のため追加 27""" 28 29plt.title("Spectrogram") 30plt.colorbar() 31plt.show()

試したこと

サンプリング周波数に問題があると考え色々と数値を変更しています。

補足情報(FW/ツールのバージョンなど)

dfのデータの内容は以下です。
time R nel
0 2.25000 4.10951 -0.474589
1 2.25005 4.10951 -0.329468
2 2.25010 4.10951 -0.288525
3 2.25015 4.10951 -0.300367
4 2.25020 4.10951 -0.256708
... ... ... ...
99995 7.24975 4.10951 -0.358798
99996 7.24980 4.10951 -0.407480
99997 7.24985 4.10951 -0.355510
99998 7.24990 4.10951 -0.389659
99999 7.24995 4.10951 -0.349249
100000 rows × 3 columns
失敗しているスペクトログラムは以下です。
イメージ説明

10/31 16:31
サンプリング周波数が大きすぎるとプロットされないことがわかりました。一旦サンプリング周波数を下げてみるとプロットされることはわかりましたが適切なサンプリング周波数の設定方法がわからない状態です。

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

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

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

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

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

jbpb0

2022/11/01 04:16

> 適切なサンプリング周波数の設定方法 fs = 1 / (t[1] - t[0]) みたいに、データの時刻と矛盾しないように決めないといけないのではないですかね
jbpb0

2022/11/01 05:03 編集

> plt.xlim([3.3, 5.8]) を削除して実行したら分かりますが、横軸が3.3よりも小さい範囲のみで計算されてるため、上記行があると表示されません > fs = 2e5 #サンプリング周波数 で、(csvファイルの「time」と合ってる)実際のサンプリング周波数よりも高い値を設定してるため、 > f,t,Sxx = signal.spectrogram(... で計算された「t」が小さな値になってるからです
jbpb0

2022/11/01 05:03

> f,t,Sxx = signal.spectrogram(... で計算された「t」は、もともとの > t = df["time"] とは別のものなので、もともとの「t」が2.25000から始まってることとは無関係になってます スペクトログラムの横軸表示をもともとの「t」に合わせたければ、 > f,t,Sxx = signal.spectrogram(... で計算された「t」に、もともとの「t」の最初の時刻2.25000を足す必要があります
NMKN

2022/11/07 00:57

jbpb0様 丁寧な解説ありがとうございます。理解できました!
guest

回答1

0

ベストアンサー

適切なサンプリング周波数の設定方法

python

1fs = 1 / (t[1] - t[0])

みたいに、データの時刻と矛盾しないように決めないといけないのではないですかね

 

plt.xlim([3.3, 5.8])

を削除して実行したら分かりますが、横軸が3.3よりも小さい範囲のみで計算されてるため、上記行があると表示されません

fs = 2e5 #サンプリング周波数

で、(csvファイルの「time」と合ってる)実際のサンプリング周波数よりも高い値を設定してるため、

f,t,Sxx = signal.spectrogram(...

で計算された「t」が小さな値になってるからです

投稿2022/11/03 07:14

jbpb0

総合スコア7658

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問