Convolución en El Dominio de La Frecuencia - Jupyter Notebook

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 8

5/1/22, 8:28 PM convolución en el dominio de la frecuencia - Jupyter Notebook

In [1]: import numpy as np


import matplotlib.pyplot as plt
from scipy import signal
import scipy
import scipy.io as sio
import copy
import pylab as pl
import time
from IPython import display
from scipy import fftpack

In [2]: #plt.plot(x_freq,H)
#modificar fwhm y peakf
#observan H
#fx por H
#x por x_freq
## create signal

In [3]: ## create signal


srate = 1000 # Hz
time = np.arange(0,3,1/srate)
n = len(time)
p = 15 # poles for random interpolation

# noise level, measured in standard deviations
noiseamp = 5

# amplitude modulator and noise level
ampl = np.interp(np.linspace(0,p,n),np.arange(0,p),np.random.rand(p)*30)
noise = noiseamp * np.random.randn(n)
signal1= ampl + noise

# subtract mean to eliminate DC
signal1 = signal1 - np.mean(signal1)


## create Gaussian spectral shape
# Gaussian parameters (in Hz)
peakf = 2
fwhm = 2

# vector of frequencies
hz = np.linspace(2,srate,n)

# frequency-domain Gaussian
s = fwhm*(2*np.pi-1)/(4*np.pi) # normalized width
x_freq = hz-peakf # shifted frequencies
H = np.exp(-.5*(x_freq/s)**2) # gaussian

localhost:8888/notebooks/convolución en el dominio de la frecuencia.ipynb 1/8


5/1/22, 8:28 PM convolución en el dominio de la frecuencia - Jupyter Notebook

In [4]: ## now for convolution



# FFTs
dataX = scipy.fftpack.fft(signal1)

# IFFT
convres = 2*np.real( scipy.fftpack.ifft( dataX*H ))

# frequencies vector
hz = np.linspace(0,srate,n)

localhost:8888/notebooks/convolución en el dominio de la frecuencia.ipynb 2/8


5/1/22, 8:28 PM convolución en el dominio de la frecuencia - Jupyter Notebook

In [5]: ### time-domain plot



# lines
plt.plot(time,signal1,'r',label='Signal')
plt.plot(time,convres,'k',label='Narrowband time signal')
plt.xlabel('Time (s)'), plt.ylabel('amp. (a.u.)')
plt.legend()
plt.title('Narrowband filter')
plt.show()



### frequency-domain plot

# plot Gaussian kernel
plt.plot(hz,H,'k')
plt.xlim([0,30])
plt.ylabel('Gain')
plt.title('Frequency-domain Gaussian')
plt.show()

# raw and filtered data spectra
plt.plot(hz,np.abs(dataX)**2,'rs-',label='Signal')
plt.plot(hz,np.abs(dataX*H)**2,'bo-',label='Conv. result')
plt.xlabel('Frequency (Hz)'), plt.ylabel('Power (a.u.)')
plt.legend()
plt.title('Frequency domain')
plt.xlim([0,25])
plt.ylim([0,1e8])
plt.show()

localhost:8888/notebooks/convolución en el dominio de la frecuencia.ipynb 3/8


5/1/22, 8:28 PM convolución en el dominio de la frecuencia - Jupyter Notebook

In [6]: plt.plot(x_freq,H)
plt.xlim([0,5])
plt.ylabel('GANANCIA')
plt.xlabel('FRECUENCIA')
plt.title('')
plt.show()

localhost:8888/notebooks/convolución en el dominio de la frecuencia.ipynb 4/8


5/1/22, 8:28 PM convolución en el dominio de la frecuencia - Jupyter Notebook

In [7]: # edge decay, must be between 0 and .5


eta = .15

# convert fwhm to indices
mp = np.round( 2*fwhm*n/srate ) # in MATLAB this is np, but np=numpy
pt = np.arange(1,mp+1)

# find center point index
fidx = np.argmin( (hz-peakf)**2 )


# define left and right exponentials
Zl = eta*(mp-1) * ( 1/pt + 1/(pt-eta*(mp-1)) )
Zr = eta*(mp-1) * ( 1/(mp-1-pt) + 1/( (1-eta)*(mp-1)-pt ) )

# create the taper
offset = mp%2
bounds = [ np.floor(eta*(mp-1))-offset , np.ceil((1-eta)*(mp-(1-offset))) ]
plancktaper = np.concatenate( (1/(np.exp(Zl[range(0,int(bounds[0]))])+1) ,np.ones

# put the taper inside zeros
px = np.zeros( len(hz) )
pidx = range( int(np.max((0,fidx-np.floor(mp/2)+1))) , int(fidx+np.floor(mp/2)-mp
px[np.round(pidx)] = plancktaper

<ipython-input-7-445770baac7d>:14: RuntimeWarning: divide by zero encountered i


n true_divide

Zr = eta*(mp-1) * ( 1/(mp-1-pt) + 1/( (1-eta)*(mp-1)-pt ) )

In [8]: ## now for convolution



# FFTs
dataX = scipy.fftpack.fft(signal1)

# IFFT
convres = 2*np.real( scipy.fftpack.ifft( dataX*px ))

localhost:8888/notebooks/convolución en el dominio de la frecuencia.ipynb 5/8


5/1/22, 8:28 PM convolución en el dominio de la frecuencia - Jupyter Notebook

In [9]: ### time-domain plots



# lines
plt.plot(time,signal1,'r',label='Signal')
plt.plot(time,convres,'k',label='Wideband time signal filtered')
plt.xlabel('Time (s)'), plt.ylabel('amp. (a.u.)')
plt.legend()
plt.title('Wideband filter')
plt.show()


### frequency-domain plot

# plot Gaussian kernel
plt.plot(hz,px,'k')
plt.xlim([0,peakf*2])
plt.ylabel('Gain')
plt.title('Frequency-domain Planck taper')
plt.show()

# raw and filtered data spectra
plt.plot(hz,np.abs(dataX)**2,'rs-',label='Signal')
plt.plot(hz,np.abs(dataX*px)**2,'bo-',label='Conv. result')
plt.xlabel('Frequency (Hz)'), plt.ylabel('Power (a.u.)')
plt.legend()
plt.title('Frequency domain')
plt.xlim([0,peakf*2])
plt.ylim([0,1e6])
plt.show()

localhost:8888/notebooks/convolución en el dominio de la frecuencia.ipynb 6/8


5/1/22, 8:28 PM convolución en el dominio de la frecuencia - Jupyter Notebook

In [ ]: ​

localhost:8888/notebooks/convolución en el dominio de la frecuencia.ipynb 7/8


5/1/22, 8:28 PM convolución en el dominio de la frecuencia - Jupyter Notebook

localhost:8888/notebooks/convolución en el dominio de la frecuencia.ipynb 8/8

You might also like