upfirdn vs lfilter scipy.signal
Nobody has claimed this yet.
Assessment
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Newbie friendliness
- 35/100
- Issue type
- Documentation
- Clarity
- Needs clarification
- Activity status
- Stale
- Tech stack
- python
- Domain
- documentation
Research direction
Start with the linked SciPy signal tutorial and inspect the referenced apply_tx_rrc_filter and apply_rrc_rx_filter entry points, along with aligned_rx_samples.csv if it is available. Clarify where this explanation belongs and document the upfirdn versus lfilter guidance, RX filtering conditions, and validation checks described in the issue.
Written by the indexing model from the issue text.
Description
Kluczowe różnice upfirdn vs lfilter scipy.signal. Wyjaśnienie dlaczego Tx zwykle potrzebuje upsamplingu + filtracji, a przy Rx z Pluto czasem nie musisz dodatkowo filtrować.
upfirdn- Funkcja z
scipy.signaldo jednoczesnego: up-samplingu → filtracji (FIR, przez współczynniki) → down-samplingu - Efektywna implementacja (zwykle polyphase) — oszczędza obliczenia przy zmianie współczynnika próbkowania
- Typowy zastosowanie: generowanie próbek DAC (upsampling + pulse-shaping na TX) lub filtrowanie + decymacja (na RX) przy zachowaniu zgodności z antyaliasingiem
- Wywołanie:
upfirdn(h, x, up=U, down=D)— h to współczynniki filtra (np. RRC), x to sygnał, U/D to współczynniki.
- Funkcja z
lfilter- Ogólny filtr liniowy realizujący różnicowe równanie filtru IIR/FIR:
y[n] = sum(b[k]*x[n-k]) - sum(a[k]*y[n-k]) - Dla FIR (
a = [1]) działa jak splot (konwolucja) bez zmiany współczynnika próbkowania - Nie wykonuje automatycznego up/down-samplingu — jeżeli chcesz zmienić fs, musisz to zrobić osobno (np.
x[::sps]) i zadbać o antyaliasing - Wywołanie:
lfilter ( b , a , x )
- Ogólny filtr liniowy realizujący różnicowe równanie filtru IIR/FIR:
Kiedy użyć którego?
upfirdn(wydajność i poprawność antyaliasingowa) użyj, jeśli chcesz jednocześnie zmienić liczbę próbek (upsample przed DAC lub downsample po filtrze)lfilterjest prosty i wystarczający jeśli chcesz jedynie przepuścić sygnał przez FIR/IIR bez zmiany fs
Dlaczego na TX stosujesz upsampling + filtr RRC upfirdn
- Nadajnik musi wykonać pulse shaping (np. RRC), aby:
- ograniczyć szerokość widma sygnału (spektralnie czystszy sygnał)
- zmniejszyć międzysymbolową interferencję (ISI)
- spełnić wymagania DAC/analogowego przetwornika i pasma RF
- Implementacja: generujesz symbole (1 próbek/symbol), upsamplujesz (do próbek DAC) i filtrujesz RRC — dokładnie to robi
upfirdn(h, symbols, up=sps) - Dodatkowo sprzęt (DAC/interpolator w Pluto) oczekuje próbek w konkretnej częstotliwości próbkowania — Tx musi zapewnić odpowiednią próbkę/kształt
Dlaczego przy odbiorze z Pluto nie zawsze trzeba dodatkowo filtrować
- Możliwe powody, dla których w twoim setupie nie robisz dodatkowego filtrowania po odbiorze:
- Pluto (lub jego łańcuch cyfrowy) może już wykonywać interpolację/filtrację/decymację i dostarczać próbki na poziomie symbol-rate (albo z już zastosowanym filtrem). W takim wypadku dane są już „przybliżone” do postaci po matched filter i dodatkowa filtracja byłaby redundantna
- Jeśli zapisujesz lub odbierasz z pliku/logu, mogą to być już przefiltrowane/przetworzone próbki (np. plik z aligned_rx_samples.csv może zawierać próbki po korekcjach)
- Czasami odbiornik stosuje własne filtry antyaliasingowe i decymację, więc dodatkowe filtrowanie nie jest konieczne jeżeli chcesz tylko analizować sygnał na tej samej częstotliwości próbkowania
- Ważne: matched filtering na Rx (RRC) dalej jest teoretycznie korzystne: maksymalizuje SNR dla sygnału z szumem AWGN i minimalizuje ISI, ale:
- Jeśli nadajnik już zastosował RRC i odbiornik/łańcuch zapewnia dopasowanie (łącznie tworzą RC), to być może nie trzeba nakładać drugiego filtru. Zwykle Tx i Rx mają po połowie (Tx RRC i Rx RRC = łączenie daje RC)
- Jeśli odebrane próbki są już zdekodowane do symboli (np. sprzęt zdejmował część łańcucha), dodatkowy RRC niekoniecznie jest potrzebny
Ryzyka i rzeczy, które warto sprawdzić
- Filtracja i delay: każdy FIR ma opóźnienie grupowe
≈ (len(h)-1)/2próbek — musisz to uwzględnić przy wyrównywaniu ramek/preambuły - Jeśli używasz
lfilter+ potemx[::sps]do downsamplingu, upewnij się, że przed downsamplowaniem był odpowiedni antyaliasing (filtr FIR odpowiednio długi).upfirdnrobi to poprawnie i wydajnie - Jeśli pominąłeś filtrację na RX i widzisz degradację (więcej błędów, rozmazane oko), spróbuj:
- zastosować
upfirdn(h, rx, up=1, down=sps)z tymi samymi h (matched filter) i porównać BER/eye
lub - przepuścić przez
lfilter(h, 1.0, rx)i potem zsynchronizować (usunąć delay) i downsample
Praktyczne rekomendacje
- Tx: stosuj
upfirdn(rrc_taps, symbols, up=sps)— to robisz poprawnie wapply_tx_rrc_filter - Rx (jeśli masz surowe, wysokoczęstotliwościowe IQ): najlepiej użyć
upfirdn(rrc_taps, rx, up=1, down=sps)lublfilter(rrc_taps, 1.0, rx)+ korekcja opóźnienia +rx[delay::sps].upfirdnupraszcza sprawę i jest bardziej wydajny przy decymacji - Jeśli Pluto lub plik już dostarcza próbki na symbol rate i/lub już po matched filterze, można pominąć dodatkową filtrację — ale zawsze to zweryfikuj: sprawdź widmo (PSD), wykres oka (eye diagram) lub przesył znanej preambuły i porównaj detekcję
Szybkie testy, które możesz wykonać
- Sprawdź PSD odebranego sygnału i porównaj z oczekiwanym kształtem RC
- Wygeneruj testowy strumień symboli z TX i odbierz lokalnie (bez RF) — porównaj efekt z i bez
apply_rrc_rx_filter - Sprawdź ustawienia Pluta (interpolator/decimator, filtry) — jeśli masz
libiio/GUI, poszukaj opcji cyfrowego filtrowania/decymacji
- Dominant language
- Python
- Stars
- 0
- Forks
- 0
- PR merge metrics
- No merged PRs in 30d
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from yabool2001/temp
-
bug
Difficulty 3/5 1-2 days Newbie friendliness 48/100
yabool2001/temp#71 ·
-
bug
Difficulty 3/5 1-2 days Newbie friendliness 35/100
yabool2001/temp#70 ·
-
Difficulty 5/5 Over a week Newbie friendliness 20/100
yabool2001/temp#69 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 55/100
yabool2001/temp#68 ·
-
Difficulty 3/5 1-2 days Newbie friendliness 38/100
yabool2001/temp#67 ·
Similar issues
-
area/auth bug comp/agent P3 platform/discord type/security
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
NousResearch/hermes-agent#117848 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 74/100
bancolombia/sentinel#23 ·
-
test md OpenCI
Difficulty 2/5 1-3 hours Newbie friendliness 74/100
-
integration:quickjs org:external priority:backlog topic:code-interpreter topic:middleware type:feature
Difficulty 2/5 1-3 hours Newbie friendliness 74/100
langchain-ai/deepagents#6450 ·
-
bug client
Difficulty 2/5 1-3 hours Newbie friendliness 88/100