পাইথনে নমুনাযুক্ত সংকেতের জন্য লোপাস ফিল্টার কীভাবে লিখবেন?


16

আমার কিছু সংকেত রয়েছে যা প্রতি 1 এনএস (1e-9 সেকেন্ড) নমুনা করেছে এবং বলি, 1e4 পয়েন্ট। এই সংকেতটি থেকে আমার উচ্চ ফ্রিকোয়েন্সি ফিল্টার করতে হবে। ধরা যাক আমাকে 10 মেগাহার্টজ এর চেয়ে বেশি ফ্রিকোয়েন্সি ফিল্টার করতে হবে। আমি চাই যে কাট অফের চেয়ে কম ফ্রিকোয়েন্সিগুলির জন্য ফ্রিকোয়েন্সি সংকেত অপরিবর্তিত হবে। এর অর্থ কাটার অফ ফ্রিকোয়েন্সি থেকে কম ফ্রিকোয়েন্সিগুলির জন্য ফিল্টারটির লাভ 1 হবে। আমি ফিল্টার অর্ডার নির্দিষ্ট করতে সক্ষম হতে চাই। আমি বলতে চাইছি, প্রথম অর্ডার ফিল্টারটিতে কাটফ ফ্রিকোয়েন্সি পরে 20 ডিবি / দশকের opeাল (পাওয়ার রোল অফ) থাকে, দ্বিতীয় অর্ডার ফিল্টারটিতে 40 ডিবি / ডেস্ক opeাল কাটফফ ফ্রিকোয়েন্সি পরে থাকে এবং ইত্যাদি। কোডের উচ্চ কার্যকারিতা গুরুত্বপূর্ণ।

উত্তর:


19

মাখন ফাংশন ব্যবহার করে ডিজাইন করা ফিল্টারটির জন্য ফ্রিকোয়েন্সি প্রতিক্রিয়া হ'ল:

বাটারওয়ার্থ ফিল্টার প্রতিক্রিয়া

তবে ফিল্টারটিকে একটি ধ্রুবক একঘেয়ে ছাঁকানো ফিল্টার ডিজাইনে সীমাবদ্ধ করার কোনও কারণ নেই। আপনি যদি স্টপব্যান্ড এবং স্টিপার ট্রানজিশন ব্যান্ডের উচ্চতর মনোযোগ চান তবে অন্যান্য বিকল্প বিদ্যমান options ব্যবহার করে একটি ফিল্টার উল্লেখ সম্পর্কে আরও তথ্যের জন্য iirdesing দেখতে এইমাখন ডিজাইনের জন্য ফ্রিকোয়েন্সি প্রতিক্রিয়া প্লটগুলি যেমন দেখায় কাটঅফ ফ্রিকোয়েন্সি (-3 ডিবি পয়েন্ট) লক্ষ্য থেকে অনেক দূরে। ফিল্টারিংয়ের আগে এটি ডাউন-স্যাম্পলিং দ্বারা হ্রাস করা যেতে পারে (ডিজাইনের ফাংশনগুলিতে এ জাতীয় সংকীর্ণ ফিল্টার, ব্যান্ডউইথের 2% এর সাথে একটি কঠিন সময় হবে)। আসল স্যাম্পল রেটটি নির্দিষ্ট করা কাটঅফের সাথে ফিল্টার করার দিকে নজর দিন।

import numpy as np
from scipy import signal
from matplotlib import pyplot as plt

from scipy.signal import fir_filter_design as ffd
from scipy.signal import filter_design as ifd

# setup some of the required parameters
Fs = 1e9           # sample-rate defined in the question, down-sampled

# remez (fir) design arguements
Fpass = 10e6       # passband edge
Fstop = 11.1e6     # stopband edge, transition band 100kHz
Wp = Fpass/(Fs)    # pass normalized frequency
Ws = Fstop/(Fs)    # stop normalized frequency

# iirdesign agruements
Wip = (Fpass)/(Fs/2)
Wis = (Fstop+1e6)/(Fs/2)
Rp = 1             # passband ripple
As = 42            # stopband attenuation

# Create a FIR filter, the remez function takes a list of 
# "bands" and the amplitude for each band.
taps = 4096
br = ffd.remez(taps, [0, Wp, Ws, .5], [1,0], maxiter=10000) 

# The iirdesign takes passband, stopband, passband ripple, 
# and stop attenuation.
bc, ac = ifd.iirdesign(Wip, Wis, Rp, As, ftype='ellip')  
bb, ab = ifd.iirdesign(Wip, Wis, Rp, As, ftype='cheby2') 

আসল নমুনা হার ফিল্টার

উল্লিখিত হিসাবে, কারণ আমরা ব্যান্ডউইথের এত ছোট শতাংশ ফিল্টার করার চেষ্টা করছি তবে ফিল্টারটির একটি ধারালো কাটঅফ থাকবে না। এই ক্ষেত্রে, লোপাস ফিল্টার, আমরা আরও ভাল ফিল্টার পাওয়ার জন্য ব্যান্ডউইথকে হ্রাস করতে পারি। পাইথন / স্কিপি.সিগনাল রেজ্যুমাল ফাংশনটি ব্যান্ডউইথ হ্রাস করতে ব্যবহার করা যেতে পারে।

দ্রষ্টব্য যে পুনরায় নমুনা ফাংশন আলিয়াজিং প্রতিরোধের জন্য ফিল্টারিং সঞ্চালন করবে। প্রিফিল্টারিংও সুগন্ধযুক্ত হতে পারে (এলিয়াসিং হ্রাস করতে) এবং এই ক্ষেত্রে আমরা কেবল 100 দ্বারা পুনরায় নমুনা করতে পারি এবং সম্পন্ন করতে পারি , তবে ফিল্টার তৈরির বিষয়ে প্রশ্ন জিজ্ঞাসা করা হয়েছিল। এই উদাহরণের জন্য আমরা 25 দ্বারা ডাউনসাম্পল করব এবং একটি নতুন ফিল্টার তৈরি করব

R = 25;            # how much to down sample by
Fsr = Fs/25.       # down-sampled sample rate
xs = signal.resample(x, len(x)/25.)

আমরা যদি এফআইআর ফিল্টারটির জন্য নকশা প্যারামিটারগুলি আপডেট করি তবে নতুন প্রতিক্রিয়া হবে।

# Down sampled version, create new filter and plot spectrum
R = 25.             # how much to down sample by
Fsr = Fs/R          # down-sampled sample rate
Fstop = 11.1e6      # modified stopband
Wp = Fpass/(Fsr)    # pass normalized frequency
Ws = Fstop/(Fsr)    # stop normalized frequency
taps = 256
br = ffd.remez(taps, [0, Wp, Ws, .5], [1,0], maxiter=10000) 

ডাউনস্যাম্পলড ফিল্টার প্রতিক্রিয়া

ডাউনস্যাম্পলড ডেটাতে চালিত ফিল্টারটির একটি ভাল প্রতিক্রিয়া রয়েছে। এফআইআর ফিল্টার ব্যবহারের আরেকটি সুবিধা হ'ল আপনার রৈখিক পর্যায়ের প্রতিক্রিয়া থাকবে।


1
ধন্যবাদ. আপনি কীভাবে সিগন্যাল স্পেকট্রামের গ্রাফ তৈরি করবেন?
অ্যালেক্স

একটি দুর্দান্ত উত্তরের জন্য অনেক ধন্যবাদ! আমি ভাবছি যদি আপনি সম্ভবত ব্যাখ্যা করতে পারেন কীভাবে রেমজ ব্যবহার করে গুণিত গুণাগুলির উপর ভিত্তি করে একটি এফআইআর ফিল্টার প্রয়োগ করতে? প্যারামিটারটির filtfiltজন্য কী চায় তা বুঝতে আমার সমস্যা হচ্ছে a
ali_m

একবার আপনি একটি ফিল্টার নকশা, (থেকে কোফিসিয়েন্টস আছে এজাহার জন্য এবং একটি IIR জন্য) আপনি একটি দম্পতি বিভিন্ন ফাংশন ব্যবহার ফিল্টারিং সম্পাদন করতে পারেন: lfilter , বিভিন্ন বস্তু একত্র পাকান , filtfilt । সাধারণত এই সমস্ত ফাংশন একই রকম কাজ করে: y = ফিল্টফিল্ট (বি, এ, এক্স) আপনার যদি একটি এফআইআর ফিল্টার থাকে তবে কেবল একটি = 1 সেট করা হয় , এক্স হ'ল ইনপুট সিগন্যাল, হ'ল এফআইআর সহগগুলি। এই পোস্টটি পাশাপাশি সাহায্য করতে পারে।
ক্রিস্টোফার ফেলটন

5

এটা কি কাজ করে?

from __future__ import division
from scipy.signal import butter, lfilter

fs = 1E9 # 1 ns -> 1 GHz
cutoff = 10E6 # 10 MHz
B, A = butter(1, cutoff / (fs / 2), btype='low') # 1st order Butterworth low-pass
filtered_signal = lfilter(B, A, signal, axis=0)

আপনি ঠিকই বলেছেন, ডকুমেন্টেশন খুব সম্পূর্ণ নয়। দেখে মনে হচ্ছে butterএটি একটি মোড়কের মতো iirfilter, যা আরও ভাল নথিভুক্ত :

N: int ফিল্টার ক্রম। ডাব্লুএন: অ্যারে_ লাইক একটি স্কেলার বা দৈর্ঘ্য -২ ক্রম সমালোচনামূলক ফ্রিকোয়েন্সি দেয়।

যদিও এই জিনিসগুলির বেশিরভাগই মাতলাব থেকে ক্লোন করা হয়েছে, সুতরাং আপনি তাদের ডকুমেন্টেশনটিও দেখতে পারেন :

নরমালাইজড কাটঅফ ফ্রিকোয়েন্সি Wn অবশ্যই 0 এবং 1 এর মধ্যে একটি সংখ্যা হতে হবে, যেখানে 1 Nyquist ফ্রিকোয়েন্সি, sample প্রতি নমুনায় রেডিয়েনের সাথে সাদৃশ্যপূর্ণ।

হালনাগাদ:

আমি এই ফাংশনগুলির জন্য ডকুমেন্টেশন যুক্ত করেছি । :) গিথুব এটিকে সহজ করে তোলে।


1

আপনার অ্যাপ্লিকেশনটি কী তা নিশ্চিত নন তবে আপনি জুনুরাডিওও যাচাই করতে চাইতে পারেন: http://gnuradio.org/doc/do ऑक्सीजन / ক্লাসগ্রা__ফিরডস html

সিগন্যাল প্রসেসিং ব্লকগুলি সি ++ তে লিখিত হয় (যদিও জ্ঞানাদিও ফ্লো গ্রাফগুলি পাইথনে রয়েছে) তবে আপনি বলেছিলেন যে উচ্চ কার্যকারিতা গুরুত্বপূর্ণ।


1

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

def firfilt(interval, freq, sampling_rate):
    nfreq = freq/(0.5*sampling_rate)
    taps =  sampling_rate + 1
    a = 1
    b = scipy.signal.firwin(taps, cutoff=nfreq)
    firstpass = scipy.signal.lfilter(b, a, interval)
    secondpass = scipy.signal.lfilter(b, a, firstpass[::-1])[::-1]
    return secondpass

ফিল্টার ডিজাইন এবং ব্যবহারের দুর্দান্ত উত্স, যেখান থেকে আমি এই কোডটি নিয়েছি এবং যেখান থেকে ব্যান্ড-পাস এবং হাই-পাস ফিল্টার উদাহরণ নেওয়া যেতে পারে, তা হ'ল এই


আমি বিশ্বাস করি না যে এফআইআর ফিল্টার ফিল্টারিংয়ের চেয়ে অনেক বেশি সুবিধা রয়েছে। একটি আইআইআর ফিল্টার ফরোয়ার্ড / রিভার্স (ফিল্টফিল্ট) থেকে উপকৃত হতে পারে কারণ আপনি বিপরীত ফিল্টারিংয়ের মাধ্যমে একটি অ-লিনিয়ার ফেজ ফিল্টার থেকে লিনিয়ার ফেজ পেতে পারেন।
ক্রিস্টোফার ফেলটন

2
ক্রিস্টোফেলফেল্টন নিজেই স্মুথড ভার্সনের সাথে একটি আরএডাব্লু ইলেক্ট্রোমায়োগ্রাফিক সিগন্যাল সিঙ্ক্রোনাইজ করার জন্য আমি কেবল বিপরীত। আমি জানি আমি কেবল সিগন্যালটি স্থানান্তর করতে পারলাম, তবে দু'বার ফিল্টার করা কম সমস্যা হওয়ায় শেষ হয়। এটি লক্ষ্য করার মতো যে দ্বিতীয় পাসটি ইতিমধ্যে ফিল্টার হওয়া প্রথম পাসটি প্রায় পরিবর্তন করে না ... লক্ষ করার জন্য ধন্যবাদ!
হেলটনবাইকার

আহা, হ্যাঁ দেরি (গ্রুপ বিলম্ব) অপসারণ করতে, ভাল পয়েন্ট।
ক্রিস্টোফার ফেলটন

1

আমার মন্তব্যের অধিকার নেই ...

@ এন্ডোলিথ: আমি scipy.signal.filtfilt (বি, এ, এক্স) ব্যবহার না করে যেখানে এক্স ফিল্টার করতে হবে ইনপুট ভেক্টর - যেমন numpy.random.normal (আকার = (এন)) ব্যবহার করে আমি আপনার মতো একই ব্যবহার করি । ফিল্টফিল্ট সিগন্যালের একটি এগিয়ে এবং বিপরীত পাস করে। সম্পূর্ণতার জন্য (বেশিরভাগই @endolith হিসাবে একই)

import numpy as np
import scipy.signal as sps

input = np.random.normal(size=(N)) # Random signal as example
bz, az = sps.butter(FiltOrder, Bandwidth/(SamplingFreq/2)) # Gives you lowpass Butterworth as default
output = sps.filtfilt(bz, az, input) # Makes forward/reverse filtering (linear phase filter)

ফিল্টফিল্ট যেমন @ হেল্টনবাইকারের পরামর্শ অনুসারে আমার বিশ্বাসযোগ্য সহগের অ্যারেগুলির প্রয়োজন। জটিল বেজব্যান্ডে আপনাকে ব্যান্ডপাস ফিল্টারিং করতে হলে আরও জড়িত কনফিগারেশন প্রয়োজন তবে এটি এখানে কোনও সমস্যা বলে মনে হয় না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.