Ramanujan Filter Banks

Period estimation using RFB - (spkit version 0.0.9.4)

Finding the hidden patterns that repeats

Single pattern with period of 10

Same example as author has shown

import numpy as np
import matplotlib.pyplot as plt
import scipy.linalg as LA
import spkit as sp


seed = 10
np.random.seed(seed)
period = 10
SNR = 0

x1 = np.zeros(30)
x2 = np.random.randn(period)
x2 = np.tile(x2,10)
x3 = np.zeros(30)
x  = np.r_[x1,x2,x3]
x /= LA.norm(x,2)

noise  = np.random.randn(len(x))
noise /= LA.norm(noise,2)

noise_power = 10**(-1*SNR/20)

noise *= noise_power
x_noise = x + noise

plt.figure(figsize=(15,3))
plt.plot(x,label='signal: x')
plt.plot(x_noise, label='signal+noise: x_noise')
plt.xlabel('sample (n)')
plt.legend()
plt.show()


Pmax = 40   #Largest period expected in signal
Rcq  = 10   #Number of repeats in each Ramanujan filter
Rav  = 2    #length of averaging filter
thr  = 0.2  #to filter out any value below Thr

y = sp.RFB(x_noise,Pmax, Rcq, Rav, thr)

plt.figure(figsize=(15,5))
im = plt.imshow(y.T,aspect='auto',cmap='jet',extent=[1,len(x_noise),Pmax,1])
plt.colorbar(im)
plt.xlabel('sample (n)')
plt.ylabel('period (in samples)')
plt.show()

plt.stem(np.arange(1,y.shape[1]+1),np.sum(y,0))
plt.xlabel('period (in samples)')
plt.ylabel('strength')
plt.show()

print('top 10 periods: ',np.argsort(np.sum(y,0))[::-1][:10]+1)
https://raw.githubusercontent.com/Nikeshbajaj/spkit/master/figures/RFB_ex1.1.png https://raw.githubusercontent.com/Nikeshbajaj/spkit/master/figures/RFB_ex1.2.png https://raw.githubusercontent.com/Nikeshbajaj/spkit/master/figures/RFB_ex1.3.png

top 10 periods: [10 5 11 18 17 16 15 14 13 12]

Multiple pattern with periods of 3,7 and 10

Same example as author has shown

import numpy as np
import matplotlib.pyplot as plt
import scipy.linalg as LA
import spkit as sp


np.random.seed(15)
#periods    = [3,7,11]
#signal_length = 100
#SNR = 10
x = np.zeros(signal_length)
for period in periods:
    x_temp  = np.random.randn(period)
    x_temp  = np.tile(x_temp,int(np.ceil(signal_length/period)))
    x_temp  = x_temp[:signal_length]
    x_temp /= LA.norm(x_temp,2)
    x += x_temp

x /= LA.norm(x,2)

noise  = np.random.randn(len(x))
noise /= LA.norm(noise,2)
noise_power = 10**(-1*SNR/20)
noise *= noise_power
x_noise = x + noise

plt.figure(figsize=(15,3))
plt.plot(x,label='signal: x')
plt.plot(x_noise, label='signal+noise: x_noise')
plt.xlabel('sample (n)')
plt.legend()
plt.show()


Pmax = 90

periodE = sp.PeriodStrength(x_noise,Pmax=Pmax,method='Ramanujan',lambd=1, L=1, cvxsol=True)

plt.stem(np.arange(len(periodE))+1,periodE)
plt.xlabel('period (in samples)')
plt.ylabel('strength')
plt.title('L1 + penality')
plt.show()

print('top 10 periods: ',np.argsort(periodE)[::-1][:10]+1)


periodE = sp.PeriodStrength(x_noise,Pmax=Pmax,method='Ramanujan',lambd=0, L=1, cvxsol=True)

plt.stem(np.arange(len(periodE))+1,periodE)
plt.xlabel('period (in samples)')
plt.ylabel('strength')
plt.title('L1 without penality')
plt.show()


print('top 10 periods: ',np.argsort(periodE)[::-1][:10]+1)


periodE = sp.PeriodStrength(x_noise,Pmax=Pmax,method='Ramanujan',lambd=1, L=2, cvxsol=False)

plt.stem(np.arange(len(periodE))+1,periodE)
plt.xlabel('period (in samples)')
plt.ylabel('strength')
plt.title('L2 +  penalty')
plt.show()

print('top 10 periods: ',np.argsort(periodE)[::-1][:10]+1)


y = sp.RFB(x_noise,Pmax = Pmax, Rcq=10, Rav=2, Th=0.2)

plt.figure(figsize=(15,5))
im = plt.imshow(y.T,aspect='auto',cmap='jet',extent=[1,len(x_noise),Pmax,1])
plt.colorbar(im)
plt.xlabel('sample (n)')
plt.ylabel('period (in samples)')
plt.show()

plt.stem(np.arange(1,y.shape[1]+1),np.sum(y,0))
plt.xlabel('period (in samples)')
plt.ylabel('strength')
plt.show()

print('top 10 periods: ',np.argsort(np.sum(y,0))[::-1][:10]+1)



XF = np.abs(np.fft.fft(x_noise))[:1+len(x_noise)//2]
fq = np.arange(len(XF))/(len(XF)-1)

plt.stem(fq,XF)
plt.title('DFT')
plt.ylabel('| X |')
plt.xlabel(r'frequency $\times$ ($\omega$/2)   ~   1/period ')
plt.show()