Scipy.signal এ ফিল্টার প্রয়োগ করছেন: lfilter বা ফিল্টফিল্ট ব্যবহার করবেন?


21

আমি একটি এসও থ্রেডে ব্যবহারের জন্য একটি পরামর্শ দেখলাম filtfiltযা পরিবর্তে পিছনের দিকে / ফরোয়ার্ড ফিল্টারিং সম্পাদন করে lfilter

অন্য কৌশল বিরুদ্ধে একটি ব্যবহার করার প্রেরণা কি?


ফিল্টফিল্ট ধীরে ধীরে
অ্যারন


1
অ্যারন filtfiltবিপরীত দিক দিয়ে একই ফিল্টারটি দু'বার করে, সুতরাং lfilterএক দিকে দু'বার করার চেয়ে ধীরগতি নয় , যা আপনি একই ফ্রিকোয়েন্সি সাড়া পাবেন would
এন্ডোলিথ

হ্যাঁ এটাই আমি বোঝাতে চাইছি। এটি দ্বিগুণ ধীর।
হারুন

আমি এটিতে নতুন এবং ফিল্টফিল্টটি ব্যবহার করার জন্য ঘুরে দেখছিলাম। @endolith বলেছেন যে scipy.signal মূল সংকেত ব্যবহার করে। মূল সিগন্যালটির অর্থ কী এবং আমরা এটি কীভাবে পেয়েছি তা নিশ্চিত নই। আমার কাছে একটি ওয়াভ ফাইল রয়েছে যা আমি আমার সিস্টেমে লোড করি তবে আমি মনে করি না এটি আসল সিগন্যাল যেহেতু এটি একটি নকল অ্যারে এবং নমুনার সংখ্যায় বিভক্ত হয়ে গেছে। যদি কেউ সাহায্য করতে পারে দয়া করে। ধন্যবাদ!
অরুণিমা পাঠানিয়া

উত্তর:


30
  • filtfiltশূন্য-পর্বের ফিল্টারিং, এটি ফিল্টার করার সাথে সাথে সিগন্যালটি স্থানান্তরিত করে না। যেহেতু সমস্ত ফ্রিকোয়েন্সিতে পর্যায়টি শূন্য, এটি লিনিয়ার-ফেজও। সময়ে পিছনে ফিল্টার করা আপনার ভবিষ্যতের পূর্বাভাসের প্রয়োজন, সুতরাং এটি কেবলমাত্র সংকেতের রেকর্ডিংয়ের অফলাইনে প্রক্রিয়াকরণের জন্য, "অনলাইন" রিয়েল-লাইফ অ্যাপ্লিকেশনগুলিতে ব্যবহার করা যাবে না।

  • lfilterকেবলমাত্র বাস্তব জীবনের বৈদ্যুতিন ফিল্টারের অনুরূপ কেবল সময়ের মধ্যে আগত ফিল্টারিং। এটি জিরো-ফেজ হতে পারে না। এটি লিনিয়ার-ফেজ (প্রতিসম এফআইআর) হতে পারে, তবে সাধারণত হয় না। সাধারণত এটি বিভিন্ন ফ্রিকোয়েন্সিগুলিতে বিলম্বের বিভিন্ন পরিমাণ যুক্ত করে।

একটি উদাহরণ এবং চিত্র এটি সুস্পষ্ট করা উচিত। যদিও ফিল্টারগুলির ফ্রিকোয়েন্সি প্রতিক্রিয়াটির মাত্রা অভিন্ন (শীর্ষে বাম এবং উপরের ডানদিকে), শূন্য-পর্বের লোপপাস লাইনগুলি মূল সংকেত সহ কেবল উচ্চ ফ্রিকোয়েন্সি সামগ্রী ছাড়াই, যখন ন্যূনতম পর্যায়ে ফিল্টারিং কার্যকারী উপায়ে সংকেতকে বিলম্ব করে :

ফিল্টফিল্ট বনাম এলফিল্টার

from __future__ import division, print_function
import numpy as np
from numpy.random import randn
from numpy.fft import rfft
from scipy import signal
import matplotlib.pyplot as plt

b, a = signal.butter(4, 0.03, analog=False)

# Show that frequency response is the same
impulse = np.zeros(1000)
impulse[500] = 1

# Applies filter forward and backward in time
imp_ff = signal.filtfilt(b, a, impulse)

# Applies filter forward in time twice (for same frequency response)
imp_lf = signal.lfilter(b, a, signal.lfilter(b, a, impulse))

plt.subplot(2, 2, 1)
plt.semilogx(20*np.log10(np.abs(rfft(imp_lf))))
plt.ylim(-100, 20)
plt.grid(True, which='both')
plt.title('lfilter')

plt.subplot(2, 2, 2)
plt.semilogx(20*np.log10(np.abs(rfft(imp_ff))))
plt.ylim(-100, 20)
plt.grid(True, which='both')
plt.title('filtfilt')

sig = np.cumsum(randn(800))  # Brownian noise
sig_ff = signal.filtfilt(b, a, sig)
sig_lf = signal.lfilter(b, a, signal.lfilter(b, a, sig))
plt.subplot(2, 1, 2)
plt.plot(sig, color='silver', label='Original')
plt.plot(sig_ff, color='#3465a4', label='filtfilt')
plt.plot(sig_lf, color='#cc0000', label='lfilter')
plt.grid(True, which='both')
plt.legend(loc="best")

4
lfilterঅগত্যা ন্যূনতম-পর্ব নয়, এটি ফিল্টার সহগের উপর নির্ভর করে যে কোনও কিছু হতে পারে তবে কোনও ক্ষেত্রে এটি কার্যকারণীয় , যা filtfiltতা নয়। সুতরাং তুলনাটির ফলাফল যা filtfiltশূন্য দেরি করে এবং lfilterসর্বদা কিছুটা বিলম্ব যুক্ত করে তা ঠিক সত্য নয়, কারণ filtfiltএটি প্রথম স্থানে অনর্থক। আসলে যা গুরুত্বপূর্ণ তা হ'ল এটি filtfiltকোনও পর্বের বিকৃতি ঘটায় না, lfilterতবে এটি (যদি না এটি লিনিয়ার ফেজ এফআইআর ফিল্টার হিসাবে ব্যবহৃত হয়, অর্থাত্ = 1 দিয়ে)।
ম্যাট এল

এটিও লক্ষণীয় যে Nth ক্রমের সাথে filtfiltফিল্টারিং (2N-1) তম অর্ডার সহ ফিল্টারিংয়ের সাথে সম্পর্কিত lfilter
টমাস আরিল্ডসেন

@ থমাস আর্লডসন কি কেবল 2N নয়? এটাই আমি স্ক্রিপ্টে প্রদর্শন করেছি
এন্ডোলিথ

@ অরুনিমাপাথানিয়া আপনার প্রশ্নের উত্তর নয়, আমার উত্তর অনুসারে মন্তব্য করা উচিত। "অরিজিনাল সিগন্যাল" এর অর্থ হ'ল সংকেত যা আপনি ফিল্টার করছেন। আপনি হয় lfilterবা দিয়ে ফিল্টার করতে পারেন filtfilt। তারা ভিন্নভাবে আচরণ করে, যেমন দেখানো হয়েছে
এন্ডোলিথ

7

@Endolith এর উত্তর সম্পূর্ণ এবং সঠিক! প্রথমে তার পোস্টটি পড়ুন এবং তারপরে এটির পাশাপাশি এটিও পোস্ট করুন। আমার স্বনামধন্যতার কারণে আমি এমন মন্তব্যের প্রতিক্রিয়া জানাতে পারিনি যেখানে @ থমাস আরিল্ডসন এবং @endolith ফিল্টার কার্যকর কার্যকর অর্ডার সম্পর্কে বিতর্ক করেছেন filtfilt:

  • lfilter প্রদত্ত ফিল্টার প্রয়োগ করে এবং ফুরিয়ার স্পেসে এটি ফিল্টার ট্রান্সফার ফাংশন ওএনএসসি'র মতো like

  • filtfiltএকই ফিল্টারটি দু'বার প্রয়োগ করুন এবং ফলস্বরূপ ফিল্টার স্থানান্তর ফাংশন স্কয়ার লাগানোর মতো। বাটারওয়ার্থ ফিল্টার ক্ষেত্রে ( scipy.signal.butter) স্থানান্তর ফাংশন সহ

জি(এন)=11-ω2এনকোথায় এন ফিল্টার অর্ডার হয়

কার্যকর লাভ হবে

জি(এন)আমিটিআমিটি=জি(এন)2=11-ω2এন

2এন2এন-1

জি(এন)আমিটিআমিটিজি(2এন)

1
উত্তর হিসাবে মন্তব্য যোগ না করার চেষ্টা করুন। তবে SE.DSP এ আপনাকে স্বাগতম, এবং আমার কাছ থেকে একটি +1 দিন have আমি মনে করি এটি উত্তরে যুক্ত করেছে ... কমপক্ষে কমেন্টে মন্তব্য করার মতো পর্যাপ্ত রেপ পেতে চেষ্টা করুন! :-)
পিটার কে

আমি এটা সত্য মনে করি না। জি (এন) হল ফিল্টারটির প্রশস্ততা অর্জন। যদি আপনি জটিল স্থানান্তর ফাংশনটি ক্যাসকেড করেন তবে আমি মনে করি এটি 2n এর কার্যকর হবে।
মাইক

আমি একটি দ্রুত সিমুলেশন দিয়ে নিশ্চিত করেছিলাম যে এএ 6th ষ্ঠ অর্ডার বাটারওয়ার্থ একই জি (2) কে ২ এক্স (তৃতীয় ক্রম বাটারওয়ার্থ) ক্যাসকেড করেছে তবে তৃতীয় আদেশের কাটার অফ ফ্রিক্যোয়েন্সিটি ১.6 দ্বারা স্কেল করে। কাটঅফ ফ্রিকোয়েন্সি স্কেলিং বাদে ফলাফলগুলি অভিন্ন। সুতরাং, অর্ডারটি 2n দিয়ে স্কেল করে তবে নোট করে রাখুন যে আপনি যখন ক্যাসকেড করবেন এবং ক্ষতিপূরণ দেওয়ার প্রয়োজন হবে তখন পাসব্যান্ডটি হ্রাস পাবে। কেউ তত্ত্বের ব্যাখ্যা দিতে নির্দ্বিধায় বোধ করেন তবে আমি সমস্ত গণিতের মধ্যে দিয়ে যেতে চাই না।
মাইক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.