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)
main-qimg-439a33619a4d8158c4298a0a33134d01-c.jpeg
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()
Vysledek.PNG
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.

output.PNG

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. :rolleyes: Kostru mám, můžu pokračovat. :thumbup: