Сигнали и системи/Други домаћи 2020 — разлика између измена
Пређи на навигацију
Пређи на претрагу
м (KockaAdmiralac преместио је страницу „Сигнали и системи/Домаћи 2020 Пример” на „Сигнали и системи/Други домаћи 2020” без остављања преусмерења: Ovde možemo sve za taj domaći da stavimo) |
(све готово) |
||
| Ред 1: | Ред 1: | ||
== Поставка и упутство == | |||
== SISSI_Primer.py == | Уз други домаћи задатак били су дати следећи фајлови: | ||
* [[Медиј:SIS domaći 2 2020 postavka.pdf|поставка]] | |||
* [[Медиј:SIS domaći 2 2020 uputstvo.pdf|упутство]] | |||
* [[Медиј:SIS domaći 2 2020 y1.wav|аудио фајл <code>y_1.wav</code>]] | |||
* [[Медиј:SIS domaći 2 2020 y2.wav|аудио фајл <code>y_2.wav</code>]] | |||
* Python код уз упутство, који следи: | |||
=== SISSI_Primer.py === | |||
<syntaxhighlight lang="python">import numpy as np | <syntaxhighlight lang="python">import numpy as np | ||
import matplotlib.pyplot as plt | import matplotlib.pyplot as plt | ||
| Ред 22: | Ред 28: | ||
#%% Zapisivanje u .wav fajl | #%% Zapisivanje u .wav fajl | ||
x_scaled = np.int16(xf/np.max(np.abs(xf)) * 32767) | x_scaled = np.int16(xf/np.max(np.abs(xf)) * 32767) | ||
wavfile.write('sissi_1_filtrirano.wav', fs, x_scaled) | wavfile.write('sissi_1_filtrirano.wav', fs, x_scaled) | ||
#%% Furijeova transformacija | #%% Furijeova transformacija | ||
X_fft = fft(x) | X_fft = fft(x) | ||
Xa = np.abs(X_fft) | Xa = np.abs(X_fft) | ||
| Ред 39: | Ред 43: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== Решење == | |||
Уз решење у виду Python кода су се предавали горенаведени фајлови као и [[Медиј:SIS domaći 2 2020 izveštaj.pdf|извештај]]. | |||
=== Python код === | |||
<syntaxhighlight lang="python">import numpy as np | |||
import numpy as np | |||
import matplotlib.pyplot as plt | |||
import scipy.signal as sci | |||
from scipy.fftpack import fft, fftshift, fftfreq | |||
from scipy.io import wavfile | |||
from matplotlib.backends.backend_pdf import PdfPages | |||
# Pomoćna funkcija za ispis u WAV fajl | |||
def writeWAV(filename, sr, sig): | |||
wavfile.write(filename, sr, np.int16(sig / np.max(np.abs(sig)) * 32767)) | |||
# Funkcija koja signal sig sa frek. odabiranja sr provlači kroz lowpass filter reda order i granične frekvencije freq | |||
def lowpass(order, sr, freq, sig): | |||
b, a = sci.butter(order, freq/(sr/2)) | |||
return sci.filtfilt(b,a,sig) | |||
# Funkcija koja signal sig sa frek. odabiranja sr provlači kroz bandpass filter reda order i graničnih frekvencija f1 i f2 | |||
def bandpass(order, sr, f1, f2, sig): | |||
b, a = sci.butter(order, np.array( ( f1/(sr/2) , f2/(sr/2) ) ) ,btype='bandpass') | |||
return sci.filtfilt(b,a,sig) | |||
# Pomoćna funkcija koja za signal sig sa frek. odabiranja sr generiše amplitudsku karakteristiku i spektar u granicama xlim1 i xlim2 | |||
# i čuva u fajl imena filename | |||
def graphFreq(sig, sr, filename, xlim1, xlim2): | |||
f = fftshift(fftfreq(len(sig), 1/sr)) | |||
plt.figure(figsize=(10,5)) | |||
plt.xlim(xlim1,xlim2) | |||
plt.plot(f, fftshift(np.abs(fft(sig)))) | |||
plt.savefig(filename) | |||
plt.close() | |||
def graphWave(sig, sr, filename): | |||
t = np.arange(0, len(sig)/sr, 1/sr) | |||
plt.figure() | |||
plt.plot(t, sig) | |||
plt.savefig(filename) | |||
plt.close() | |||
# Konstante | |||
freqChannel = 18000 | |||
freqLP1 = 4000 | |||
freqLP2 = 6000 | |||
freqCarrier = 10000 | |||
freqBP_l = freqCarrier - freqLP2 | |||
freqBP_h = freqCarrier + freqLP2 | |||
# Učitavanje fajla | |||
sampleRate1, y1 = wavfile.read('y_1.wav') | |||
sampleRate2, y2 = wavfile.read('y_2.wav') | |||
# Ulazno filtriranje | |||
y1f = lowpass(10, sampleRate1, freqLP1, y1) | |||
y2f = lowpass(10, sampleRate1, freqLP2, y2) | |||
# Modulacija | |||
t = np.linspace(0, len(y2f)/sampleRate2, num=len(y2f) ) | |||
y2m = y2f * np.cos(2*np.pi*freqCarrier*t) | |||
# Spajanje | |||
yt = y1f + y2m | |||
# Prolaz kroz kanal | |||
yr = lowpass(5, sampleRate1, freqChannel, yt) | |||
# Odvajanje | |||
y1r = lowpass(10, sampleRate1, freqLP1, yr) | |||
y2b = bandpass(10, sampleRate1, freqBP_l,freqBP_h, yr) | |||
y2d = y2b * np.cos(2*np.pi*freqCarrier*t) | |||
y2r = lowpass(10, sampleRate1, freqLP2, y2d) | |||
# Generisanje grafika i audio fajlova | |||
signali = [y1, y2, y1f, y2f, y2m, yt, yr, y2b, y2d,y1r, y2r] | |||
ime = ['y1','y2', 'y1f', 'y2f', 'y2m', 'yt', 'yr','y2b', 'y2d','y1r', 'y2r'] | |||
for i, sig in enumerate(signali): | |||
graphFreq(sig, sampleRate1, ime[i]+'.pdf', -sampleRate1/2,sampleRate1/2) | |||
graphWave(sig, sampleRate1, ime[i]+'-w.pdf') | |||
if (i > 2): writeWAV(ime[i]+'.wav', sampleRate1, sig) | |||
</syntaxhighlight> | |||
[[Категорија:Сигнали и системи]] | |||
Верзија на датум 8. јул 2021. у 21:53
Поставка и упутство
Уз други домаћи задатак били су дати следећи фајлови:
- поставка
- упутство
- аудио фајл
y_1.wav - аудио фајл
y_2.wav - Python код уз упутство, који следи:
SISSI_Primer.py
import numpy as np
import matplotlib.pyplot as plt
import scipy.signal as sci
from scipy.fftpack import fft, fftshift, fftfreq
from scipy.io import wavfile
#%% Učitavanje fajla
fs, x = wavfile.read('sissi_1.wav')
#%% Generisanje vremenske i frekvencijske ose
t_osa = np.arange(0, len(x)/fs, 1/fs)
f_osa = fftshift(fftfreq(len(x), 1/fs))
#%% Projektovanje filtra i filtriranje signala
f_gr = 3000
n = 6
[b, a] = sci.butter(n, f_gr/(fs/2), btype='lowpass')
xf = sci.filtfilt(b, a, x)
#%% Zapisivanje u .wav fajl
x_scaled = np.int16(xf/np.max(np.abs(xf)) * 32767)
wavfile.write('sissi_1_filtrirano.wav', fs, x_scaled)
#%% Furijeova transformacija
X_fft = fft(x)
Xa = np.abs(X_fft)
plt.figure()
plt.subplot(2,1,1)
plt.plot(t_osa, xf)
plt.subplot(2,1,2)
plt.plot(f_osa, fftshift(X_fft))
plt.show()
Решење
Уз решење у виду Python кода су се предавали горенаведени фајлови као и извештај.
Python код
import numpy as np
import numpy as np
import matplotlib.pyplot as plt
import scipy.signal as sci
from scipy.fftpack import fft, fftshift, fftfreq
from scipy.io import wavfile
from matplotlib.backends.backend_pdf import PdfPages
# Pomoćna funkcija za ispis u WAV fajl
def writeWAV(filename, sr, sig):
wavfile.write(filename, sr, np.int16(sig / np.max(np.abs(sig)) * 32767))
# Funkcija koja signal sig sa frek. odabiranja sr provlači kroz lowpass filter reda order i granične frekvencije freq
def lowpass(order, sr, freq, sig):
b, a = sci.butter(order, freq/(sr/2))
return sci.filtfilt(b,a,sig)
# Funkcija koja signal sig sa frek. odabiranja sr provlači kroz bandpass filter reda order i graničnih frekvencija f1 i f2
def bandpass(order, sr, f1, f2, sig):
b, a = sci.butter(order, np.array( ( f1/(sr/2) , f2/(sr/2) ) ) ,btype='bandpass')
return sci.filtfilt(b,a,sig)
# Pomoćna funkcija koja za signal sig sa frek. odabiranja sr generiše amplitudsku karakteristiku i spektar u granicama xlim1 i xlim2
# i čuva u fajl imena filename
def graphFreq(sig, sr, filename, xlim1, xlim2):
f = fftshift(fftfreq(len(sig), 1/sr))
plt.figure(figsize=(10,5))
plt.xlim(xlim1,xlim2)
plt.plot(f, fftshift(np.abs(fft(sig))))
plt.savefig(filename)
plt.close()
def graphWave(sig, sr, filename):
t = np.arange(0, len(sig)/sr, 1/sr)
plt.figure()
plt.plot(t, sig)
plt.savefig(filename)
plt.close()
# Konstante
freqChannel = 18000
freqLP1 = 4000
freqLP2 = 6000
freqCarrier = 10000
freqBP_l = freqCarrier - freqLP2
freqBP_h = freqCarrier + freqLP2
# Učitavanje fajla
sampleRate1, y1 = wavfile.read('y_1.wav')
sampleRate2, y2 = wavfile.read('y_2.wav')
# Ulazno filtriranje
y1f = lowpass(10, sampleRate1, freqLP1, y1)
y2f = lowpass(10, sampleRate1, freqLP2, y2)
# Modulacija
t = np.linspace(0, len(y2f)/sampleRate2, num=len(y2f) )
y2m = y2f * np.cos(2*np.pi*freqCarrier*t)
# Spajanje
yt = y1f + y2m
# Prolaz kroz kanal
yr = lowpass(5, sampleRate1, freqChannel, yt)
# Odvajanje
y1r = lowpass(10, sampleRate1, freqLP1, yr)
y2b = bandpass(10, sampleRate1, freqBP_l,freqBP_h, yr)
y2d = y2b * np.cos(2*np.pi*freqCarrier*t)
y2r = lowpass(10, sampleRate1, freqLP2, y2d)
# Generisanje grafika i audio fajlova
signali = [y1, y2, y1f, y2f, y2m, yt, yr, y2b, y2d,y1r, y2r]
ime = ['y1','y2', 'y1f', 'y2f', 'y2m', 'yt', 'yr','y2b', 'y2d','y1r', 'y2r']
for i, sig in enumerate(signali):
graphFreq(sig, sampleRate1, ime[i]+'.pdf', -sampleRate1/2,sampleRate1/2)
graphWave(sig, sampleRate1, ime[i]+'-w.pdf')
if (i > 2): writeWAV(ime[i]+'.wav', sampleRate1, sig)