upfirdn vs lfilter scipy.signal

Open
#6 0 comments 0 reactions 0 assignees View on GitHub

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

question

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.signal do 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.
  • 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 )

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)
  • lfilter jest 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

  1. 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
  1. Implementacja: generujesz symbole (1 próbek/symbol), upsamplujesz (do próbek DAC) i filtrujesz RRC — dokładnie to robi upfirdn(h, symbols, up=sps)
  2. 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ć

  1. Filtracja i delay: każdy FIR ma opóźnienie grupowe ≈ (len(h)-1)/2 próbek — musisz to uwzględnić przy wyrównywaniu ramek/preambuły
  2. Jeśli używasz lfilter + potem x[::sps] do downsamplingu, upewnij się, że przed downsamplowaniem był odpowiedni antyaliasing (filtr FIR odpowiednio długi). upfirdn robi to poprawnie i wydajnie
  3. 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

  1. Tx: stosuj upfirdn(rrc_taps, symbols, up=sps) — to robisz poprawnie w apply_tx_rrc_filter
  2. Rx (jeśli masz surowe, wysokoczęstotliwościowe IQ): najlepiej użyć upfirdn(rrc_taps, rx, up=1, down=sps) lub lfilter(rrc_taps, 1.0, rx) + korekcja opóźnienia + rx[delay::sps]. upfirdn upraszcza sprawę i jest bardziej wydajny przy decymacji
  3. 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ć

  1. Sprawdź PSD odebranego sygnału i porównaj z oczekiwanym kształtem RC
  2. Wygeneruj testowy strumień symboli z TX i odbierz lokalnie (bez RF) — porównaj efekt z i bez apply_rrc_rx_filter
  3. 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

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from yabool2001/temp

All issues in yabool2001/temp

Similar issues

More Python issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.