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

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

新規登録して質問してみよう
ただいま回答率
85.35%
最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

Python

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

Q&A

解決済

1回答

7970閲覧

XRD回析図のピークをノイズを含まずに検出したい

recrystal

総合スコア3

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

Python

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

0グッド

0クリップ

投稿2020/11/30 07:49

編集2020/12/01 03:42

1.実現したいこと
XRD測定の解析を行う上で回析図のピークを検出するため,現在はsignal.argrelmaxを
用いて,極大値を算出することで検出しております。
しかし,このやり方ではノイズの極大値を拾い,また間隔がせまいピークは検出
することができないという問題点が発生してしまいます。

そこで微分によるピーク検出や平滑化などで
・ノイズの削除
・すべてのピークの検出
を実現したいと考えています。
とてもアバウトな質問ですが,どなたか回答をお願いします。

2.コード

import pandas as pd import numpy as np from scipy import signal import matplotlib.pyplot as plt import os file = pd.read_csv("D.csv") xx = file.iloc[:,0] yy = file.iloc[:,1] #データの変換,signal.argrelmax()関数がPandasのSeriesやDataFrameに対応していないため x = np.array(xx) y = np.array(yy) maxid = signal.argrelmax(y, order=100) #極大値 orderを変えることでピークの検出が変わる(ピーク検出の閾値) #minid = signal.argrelmin(y, order=1) #極小値 x_max = max(x) y_max = max(y) y_min = min(y) x_min = min(x) plt.figure(figsize=(5,8))#図のアスペクト比を変更(横×縦) #棒グラフの図示 width=線の幅,デフォルトは0.8 plt.bar(x,y, width=0.3) #plt.plot((x, y), pltsize=(6,6)) plt.tick_params(labelsize = 9)#目盛りの数字の大きさを変更 plt.ylim(y_min, y_max*1.1) # y 軸の範囲の設定, plt.xlim(10,80) # x 軸の範囲の設定 #plt.show() plt.xlabel("2θ" , fontsize = 20) #plt.tight_layout() plt.plot(x[maxid],y[maxid],'ro',label='peak_max') #plt.plot(x[minid],y[minid],'bo',label='ピーク値(最小)') plt.legend() print(maxid)

3.試したこと
orderの値を変更させると,望むピークは得られるのですが手動での操作に
なってしまいますので,できれば自動で行いたいです。

4.使っているツール
python 3.7 , spyder

5.現段階のピーク検出図
イメージ説明
横軸の10付近の3点なども含まれてしまい,ピークのみ検出したいです

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

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

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

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

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

jeanbiego

2020/12/01 00:27

D.csvか、またはその代わりとなるテストデータがないと、試すことができません。 また、実行した結果のノイズとシグナルの差異を図示しないと、X線回折装置を使ったことがない人からは何もアドバイスできないかと(私もです)
recrystal

2020/12/01 03:44

図を追加いたしました。 ピークにがないところに点が打たれているのがノイズです。
guest

回答1

0

ベストアンサー

・一定値以下をNoiseとみなす、というのがわかっているならばfind_peaksでheightを指定してあげるという手がありそうです。(テストデータがないので試してはいませんが)
scipy.signal.find_peaks
ただ、私はX線回折をしたことがないのでわかりませんが、試料の状態でPeakとNoiseの絶対値が大きく変動するようだと元のコードでorderで調整したほうが早いでしょう。

ちなみに、「ピークにがないところに点が打たれているのがノイズです。」と書かれていますが、Peakとそれ以外を選別しているルールは何ですか? 「一定値以下をノイズとみなす」なら上の方法で対応できます。
しかし、「この試料からはこの位置にPeakが出るはずがない」という知識に基づいての判定だと、プログラミングでは対応できなくなります。(特定の位置をマスクして見えなくすることもできますが、これは捏造に片足突っ込んでるので、測定を工夫するほうが優先ですね)

投稿2020/12/01 04:22

jeanbiego

総合スコア3966

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

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

recrystal

2020/12/01 04:31

「一定値以下をノイズとみなす」という方法で一度試してみたいと思います。 ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問