Strana 1 z 1
Python - generování pulzní modulace
Napísané: 23 Aug 2021, 17:29
od používateľa jirka.jirka.
Zdravím pánové,
bojuji s pythonem a pokouším se generovat pulzní modulaci a vykreslit to v grafu.
Něco jsem se s internetem pokusil udělat, ale výsledek je nula. Parametry, které se budou nastavovat:
Fc - nosná frekvence
PW - šířka pulsu
PRI - opakovačka (Pulse Repitition Period)
Konkrétně bych potřeboval pomocí těchto 3 parametrů vygenerovat IQ vzorky, které se pokusím nahrát do pokusného SDR-ka ke generování mého signálu. Ale ohledně tohoto jsem teprve v plenkách.
Zde je nějaký kód, co jsem vyhrabal pomocí google, ale ne a ne jej adekvátně upravit. Např. při pokusu o odstranění noise se mi to celé rozrýpe.
Kód: Vybrať všetko
import time
import sys
import matplotlib.pyplot as plt
import numpy as np
from scipy import signal
freq = 1000000
fs = int(2*freq) # sample rate
x = np.linspace(0, 20, fs)
noise1 = 0.01*np.sin(2*np.pi * 1*x) + 0.05*np.sin(2*np.pi * 1.5*x) + 0.04*np.sin(2*np.pi * 0.2*x)
noise2 = 0.1*np.sin(2*np.pi * 0.1*x) + 0.2*np.sin(2*np.pi * 1.8*x) + 0.1*np.sin(2*np.pi * 0.4*x)
realSignal = 2*np.sin(2*np.pi * freq*x)
sig = noise1
sig = np.append(sig, [realSignal, noise1*noise2, realSignal, noise1*noise2])
plt.plot(sig)
plt.show()
Tak třeba někdo poradí. Děkuji
Re: Python - generování pulzní modulace
Napísané: 23 Aug 2021, 17:59
od používateľa jirka.jirka.
Tady se mi podařilo vygenerovat vlastní průběh:
Kód: Vybrať všetko
import time
import sys
import matplotlib.pyplot as plt
import numpy as np
from scipy import signal
import sk_dsp_comm.sigsys as ss
from IPython.display import Image, SVG
fs = 100 # sampling rate in Hz
tau = 1
t = np.arange(-5,5,1/fs)
x3 = ss.rect(t-.5,tau)
y = x3*np.cos(2*np.pi*10*t)
plt.subplot(211)
plt.plot(t,x3)
plt.plot(t,y)
plt.grid()
plt.ylim([-1.1,1.1])
plt.xlim([-2,2])
plt.show()
Ale teď otázka, jak zakomponovat moje požadavky. Tzn. nosnou, PRI, PW.
Re: Python - generování pulzní modulace
Napísané: 23 Aug 2021, 18:34
od používateľa maskrtnik01
Ja by som na to išiel takto.
Spravil by som si signál nosnej frekvencie, čiže sínus Fc.
Ďalej signál obálky, tam hranatý signál s Ton=PW, Tperiod=PRI. Počas pulzu by mal obdĺžnik hodnotu 1, inde 0.
Keď sa to prenásobí, malo by vyjsť čo požadujete.
Sínus už je vidno v zdrojových kódoch. Na obdĺžnik som našiel
https://docs.scipy.org/doc/scipy/refere ... quare.html .
Re: Python - generování pulzní modulace
Napísané: 23 Aug 2021, 19:07
od používateľa jirka.jirka.
Nápad pěkný.
Takže pokrok. Zde jsou funkce v základu pro generování obdélníku a sinu.
Kód: Vybrať všetko
freq_sine = 2500000 # freq in Hz
freq_square = 2000000 # freq in Hz
from scipy import signal
import matplotlib.pyplot as plt
t = np.linspace(0, 0.000005, freq_square*2, endpoint=False)
plt.plot(t, signal.square(2 * np.pi * freq_square * t))
plt.ylim(-2, 2)
plt.show()
t = np.linspace(0, 0.000005, freq_sine*2, endpoint=False)
fs = int(2*freq) # sample rate
sine_wave = 2*np.sin(2*np.pi * freq_sine*t)
plt.plot(sine_wave)
plt.show()
Re: Python - generování pulzní modulace
Napísané: 23 Aug 2021, 19:35
od používateľa jirka.jirka.
Takže mám dvě funkce, sinus a obdélník.
Výstupy jsou: square_wave a sine_wave. Ale už nevím, jak data zkombinovat. Nějaký nápad?
Kód: Vybrať všetko
from scipy import signal
import matplotlib.pyplot as plt
freq_sine = 2500000 # freq in Hz
freq_square = 2000000 # freq in Hz
t = np.linspace(0, 0.000005, freq_square*2, endpoint=False)
square_wave = signal.square(2 * np.pi * freq_square * t)
plt.plot(square_wave )
plt.ylim(-2, 2)
plt.show()
t = np.linspace(0, 0.000005, freq_sine*2, endpoint=False)
fs = int(2*freq) # sample rate
sine_wave = 2*np.sin(2*np.pi * freq_sine*t)
plt.plot(sine_wave)
plt.show()
Já zkoušel data zkombinovat tak nějak říkajíc laicky:
Kód: Vybrať všetko
for x in square_wave:
output_wave[x] = sine_wave[x]*square_wave[x]
plt.plot(output_wave)
plt.show()
Ale výstup je chybný:
- File "D:\pulse_modulation.py", line 66, in <module>
output_wave[x] = sine_wave[x]*square_wave[x]
IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices
Re: Python - generování pulzní modulace
Napísané: 23 Aug 2021, 19:47
od používateľa maskrtnik01
Na to by aj mohla byť vstavaná funkcia, aj keď mne sa nepodarilo nájsť.
Každopádne, aj takto by to malo ísť. Máte tam ale syntaktickú chybu.
Je tam, pre každé x z square_wave, a následne x-kom indexujete signály (v iných jazykoch známe ako for each cyklus). For cyklus sa v pythone píše for i in range(max). Treba ešte zistiť(resp. vedieť) koľko vzoriek majú tie signály, to pôjde ako argument do range.
Re: Python - generování pulzní modulace
Napísané: 23 Aug 2021, 20:05
od používateľa jirka.jirka.
Vypadá to snadno, ale opak je pravdou. Zkusil jsem to vyřešit takto:
Kód: Vybrať všetko
output_wave = []
for i in range(len(square_wave)):
output_wave[i] = sine_wave[i]*square_wave[i]
plt.plot(output_wave)
plt.show()
Ale chyba se změnila:
- File "D:\pulse_modulation.py", line 68, in <module>
output_wave = sine_wave*square_wave
IndexError: list assignment index out of range
Edit:
Zde se mi podařilo něco najít, ale nic moc to neudělalo. Ten krom toho, že to generuje chybu, ale program vytuhne:
Kód: Vybrať všetko
output_wave = square_wave[0]
for i in range(1, len(square_wave)):
output_wave = np.vstack([output_wave,square_wave[i]])
plt.plot(output_wave)
plt.show()
Re: Python - generování pulzní modulace
Napísané: 23 Aug 2021, 20:26
od používateľa maskrtnik01
K tomu prvému. Samozrejme, že keď output_wave je prázdny zoznam, tak s tými indexami sa dostanete mimo rozsah. Treba ho inicializovať ako len(square_wave) núl.
https://numpy.org/doc/stable/reference/ ... _like.html
Re: Python - generování pulzní modulace
Napísané: 24 Aug 2021, 08:25
od používateľa jirka.jirka.
Kód: Vybrať všetko
output_wave = []
for i in range(len(square_wave)):
output_wave.append(square_wave[i]*sine_wave[i])
plt.plot(output_wave)
plt.show()
Chtělo si to zdřímnout.
Kostru mám, můžu pokračovat.