Puncak deteksi sinyal diukur

Kami menggunakan data acquisition card untuk mengambil bacaan dari sebuah perangkat yang meningkatkan sinyal ke puncak dan kemudian turun kembali mendekati nilai asli. Untuk menemukan nilai puncak saat ini kami mencari hotel yang tertinggi membaca dan menggunakan indeks untuk menentukan waktu puncak nilai yang digunakan dalam perhitungan kami.

Ini bekerja dengan baik jika nilai tertinggi adalah puncak kita cari, tetapi jika perangkat tidak bekerja dengan benar kita dapat melihat puncak kedua yang dapat lebih tinggi dari puncak awal. Kami mengambil 10 pembacaan kedua dari 16 perangkat lebih dari 90 detik.

Awal saya pikiran untuk siklus melalui pembacaan memeriksa untuk melihat apakah sebelumnya dan berikutnya poin kurang dari saat ini untuk menemukan puncak dan membangun sebuah array dari puncak. Mungkin kita harus melihat rata-rata dari jumlah poin kedua sisi dari posisi saat ini untuk memungkinkan untuk kebisingan di sistem. Ini adalah cara terbaik untuk melanjutkan atau ada teknik yang lebih baik?


Kami menggunakan LabVIEW dan saya telah memeriksa LAVA forum dan ada sejumlah contoh-contoh yang menarik. Ini adalah bagian dari uji coba perangkat lunak dan kami mencoba untuk menghindari menggunakan terlalu banyak non-standar VI perpustakaan, jadi saya berharap untuk umpan balik pada proses/algoritma yang terlibat daripada kode tertentu.

Ada banyak dan banyak klasik puncak metode deteksi yang mungkin bekerja. Anda'll harus melihat apa yang, khususnya, batas kualitas data anda. Berikut ini adalah deskripsi dasar:

  1. Antara dua titik dalam data anda, (x(0), y(0)) dan (x(n) y(n)), tambahkan y(i + 1) - y(i) untuk 0 <= i < n dan menyebutnya T ("perjalanan") dan R ("naik") untuk y(n) - y(0) + k untuk sesuai kecil k. T/R > 1 menunjukkan puncak. Ini bekerja OK jika perjalanan besar karena kebisingan adalah tidak mungkin atau jika kebisingan mendistribusikan secara simetris di sekitar base bentuk kurva. Untuk aplikasi anda, menerima awal puncak dengan skor di atas ambang tertentu, atau menganalisis kurva perjalanan per kenaikan nilai yang lebih menarik dan offline.

  2. Menggunakan matched filter untuk mencetak kesamaan standar bentuk puncak (pada dasarnya, menggunakan normalized dot-produk terhadap beberapa bentuk untuk mendapatkan cosinus-metrik kesamaan)

  3. Deconvolve terhadap standar peak bentuk dan memeriksa nilai-nilai yang tinggi (meskipun saya sering menemukan 2 menjadi kurang sensitif terhadap suara untuk instrumentasi sederhana output).

  4. Mulus data dan memeriksa kembar tiga dari sama spasi poin di mana, jika x0 < x1 < x2, y1 > 0.5 * (y0 + y2), atau memeriksa jarak Euclidean seperti ini: D((x0, y0), (x1, y1)) + D((x1, y1), (x2, y2)) > A((x0, y0),(x2, y2)), yang bergantung pada segitiga ketimpangan. Menggunakan rasio-rasio sederhana akan kembali memberikan anda sebuah mekanisme penilaian.

  5. Sesuai sangat sederhana 2-gaussian mixture model untuk data anda (misalnya, Numerik Resep bagus siap pakai potongan code). Ambil sebelumnya puncak. Ini akan bergerak dengan benar dengan tumpang tindih puncak.

  6. Menemukan yang paling cocok dalam data sederhana Gaussian, Cauchy, Poisson, atau apa-yang-kau kurva. Mengevaluasi kurva ini lebih luas dan kurangi dari salinan data setelah dicatat itu's lokasi puncak. Ulangi. Ambil awal puncak dan parameter model (standar deviasi mungkin, tapi beberapa aplikasi mungkin peduli tentang kurtosis atau fitur-fitur lainnya) memenuhi beberapa kriteria. Watch out untuk artefak yang ditinggalkan ketika puncak dikurangi dari data. Terbaik pertandingan mungkin akan ditentukan oleh pertandingan semacam penilaian yang disarankan di #2 di atas.

I've melakukan apa yang anda're lakukan sebelum: menemukan puncak di urutan DNA data, menemukan puncak di derivatif diperkirakan diukur dari kurva, dan menemukan puncak dalam histogram.

Saya mendorong anda untuk menghadiri hati-hati untuk yang tepat baselining. Wiener filtering atau penyaringan atau sederhana analisis histogram adalah sering cara mudah untuk baseline kehadiran noise.

Akhirnya, jika data anda yang biasanya berisik dan anda're mendapatkan data dari kartu sebagai artikel output single-ended (atau bahkan dirujuk, tidak hanya diferensial), dan jika anda're rata-rata banyak pengamatan ke setiap titik data, mencoba memilah orang-orang pengamatan dan membuang yang pertama dan terakhir kuartil dan rataan apa yang tersisa. Ada tempat-tempat seperti outlier eliminasi taktik itu dapat benar-benar berguna.

Komentar (4)
Larutan

Anda bisa mencoba sinyal rata-rata, yaitu masing-masing titik, rata-rata nilai dengan sekitar 3 atau lebih poin. Jika kebisingan kerlip yang besar, maka ini pun tidak dapat membantu.

Saya menyadari bahwa ini adalah bahasa agnostik, tapi menduga bahwa anda menggunakan LabView, ada banyak pra-dikemas pemrosesan sinyal VIs yang datang dengan LabView yang dapat anda gunakan untuk melakukan smoothing dan pengurangan kebisingan. The NI forum adalah tempat yang bagus untuk mendapatkan lebih khusus bantuan pada hal semacam ini.

Komentar (0)

Saya ingin berkontribusi untuk thread ini algoritma yang saya telah mengembangkan diri:

Hal ini didasarkan pada prinsip dispersi: jika baru datapoint diberikan x jumlah standar deviasi dari beberapa bergerak berarti, algoritma sinyal (juga disebut z-score). Algoritma ini sangat kuat karena konstruksi a terpisah bergerak mean dan deviasi, sehingga sinyal tidak korup ambang batas. Sinyal masa depan karena itu diidentifikasi dengan sekitar akurasi yang sama, terlepas dari jumlah sebelumnya sinyal. Algoritma ini membutuhkan waktu 3 input: lag = lag bergerak window, threshold = z-score di mana algoritma sinyal dan pengaruh = pengaruh (antara 0 dan 1) dari sinyal baru di mean dan deviasi standar. Misalnya, lag 5 akan menggunakan 5 observasi untuk kelancaran data. A ambang batas dari 3.5 akan memberikan sinyal jika datapoint adalah 3.5 standar deviasi dari moving berarti. Dan pengaruh 0,5 memberikan sinyal setengah pengaruh yang normal datapoints memiliki. Demikian juga, sebuah pengaruh 0 mengabaikan sinyal benar-benar untuk menghitung ambang baru: pengaruh dari 0 oleh karena itu yang paling kuat pilihan.

Ia bekerja sebagai berikut:

Pseudocode

# Let y be a vector of timeseries data of at least length lag+2
# Let mean() be a function that calculates the mean
# Let std() be a function that calculates the standard deviaton
# Let absolute() be the absolute value function

# Settings (the ones below are examples: choose what is best for your data)
set lag to 5;          # lag 5 for the smoothing functions
set threshold to 3.5;  # 3.5 standard deviations for signal
set influence to 0.5;  # between 0 and 1, where 1 is normal influence, 0.5 is half

# Initialise variables
set signals to vector 0,...,0 of length of y;   # Initialise signal results
set filteredY to y(1,...,lag)                   # Initialise filtered series
set avgFilter to null;                          # Initialise average filter
set stdFilter to null;                          # Initialise std. filter
set avgFilter(lag) to mean(y(1,...,lag));       # Initialise first value
set stdFilter(lag) to std(y(1,...,lag));        # Initialise first value

for i=lag+1,...,t do
  if absolute(y(i) - avgFilter(i-1)) > threshold*stdFilter(i-1) then
    if y(i) > avgFilter(i-1)
      set signals(i) to +1;                     # Positive signal
    else
      set signals(i) to -1;                     # Negative signal
    end
    # Adjust the filters
    set filteredY(i) to influence*y(i) + (1-influence)*filteredY(i-1);
    set avgFilter(i) to mean(filteredY(i-lag,i),lag);
    set stdFilter(i) to std(filteredY(i-lag,i),lag);
  else
    set signals(i) to 0;                        # No signal
    # Adjust the filters
    set filteredY(i) to y(i);
    set avgFilter(i) to mean(filteredY(i-lag,i),lag);
    set stdFilter(i) to std(filteredY(i-lag,i),lag);
  end
end

Demo

> Asli answer

Komentar (2)

Masalah ini telah diteliti dalam beberapa detail.

Ada satu set yang sangat up-to-date implementasi di TSpectrum* kelas ROOT (nuklir/fisika partikel alat analisis). Kode bekerja dalam satu - tiga-dimensi data.

AKAR kode sumber tersedia, sehingga anda dapat mengambil implementasi ini jika anda ingin.

Dari TSpectrum kelas dokumentasi:

Algoritma yang digunakan dalam kelas ini telah dipublikasikan di referensi berikut:

[1] M. Morhac et al.: Latar belakang metode penghapusan untuk multidimensi kebetulan gamma-ray spectra. Nuklir Instrumen dan Metode Penelitian Fisika 401 (1997) 113- 132.

[2] M. Morhac et al.: Efisien satu - dan dua-dimensi Emas metode dan aplikasi untuk gamma-ray spektrum dekomposisi. Nuklir Instrumen dan Metode dalam Penelitian Fisika 401 (1997) 385-408.

[3] M. Morhac et al.: Identifikasi puncak-puncak di multidimensi kebetulan gamma-ray spectra. Nuklir Instrumen dan Metode Penelitian Fisika A 443(2000), 108-125.

Makalah terkait dari kelas dokumentasi bagi anda yang don't memiliki NIM online langganan.


Versi pendek dari apa yang dilakukan adalah bahwa histogram diratakan untuk menghilangkan noise, dan kemudian local maxima terdeteksi oleh brute force dalam meratakan histogram.

Komentar (0)

Metode ini pada dasarnya adalah David Marr's buku "Visi"

Gaussian blur sinyal anda dengan yang diharapkan lebar puncak. ini akan menyingkirkan paku kebisingan dan fase data tidak rusak.

Kemudian mendeteksi tepi (LOG akan melakukan)

Kemudian anda tepi tepi fitur (seperti puncak). terlihat antara tepi puncak, semacam puncak dengan ukuran, dan anda'kembali dilakukan.

Saya telah menggunakan variasi ini dan mereka bekerja dengan sangat baik.

Komentar (0)

Saya pikir anda ingin cross-berkorelasi sinyal anda dengan yang diharapkan, teladan sinyal. Tapi, itu sudah waktu yang lama sejak saya mempelajari pemrosesan sinyal dan bahkan kemudian saya didn't mengambil banyak pemberitahuan.

Komentar (0)

Anda bisa menerapkan beberapa Standar Deviasi untuk logika anda dan mengambil melihat dari puncak lebih dari x%.

Komentar (0)

Apakah ada perbedaan kualitatif antara puncak diinginkan dan yang tidak diinginkan kedua puncak? Jika kedua puncak "tajam" -- yaitu pendek dalam durasi waktu -- ketika melihat sinyal dalam domain frekuensi (dengan melakukan FFT) anda'll mendapatkan energi pada kebanyakan band. Tapi jika "baik" puncak dipercaya memiliki energi yang hadir pada frekuensi yang tidak ada di "buruk" puncak, atau sebaliknya, anda mungkin dapat secara otomatis membedakan mereka dengan cara itu.

Komentar (0)

Saya don't tahu sangat banyak tentang instrumentasi, jadi ini mungkin benar-benar tidak praktis, tapi sekali lagi ini mungkin akan membantu arah yang berbeda. Jika anda tahu bagaimana bacaan bisa gagal, dan ada interval tertentu antara puncak mengingat kegagalan tersebut, mengapa tidak melakukan gradient descent pada masing-masing interval. Jika keturunan membawa anda kembali ke daerah anda've dicari sebelum, anda dapat meninggalkannya. Tergantung pada bentuk permukaan sampel, hal ini juga bisa membantu anda mencari puncak lebih cepat dari pencarian.

Komentar (0)