#!usr/bin/python

from pysptk.sptk import *
from scipy.signal import hamming
import numpy.matlib
import scipy
import scipy.io.wavfile as wav
import numpy as np
import wave
from python_speech_features.sigproc import *
from math import *

def readWavFile(wav):
	#given a path from the keyboard to read a .wav file
	#wav = raw_input('Give me the path of the .wav file you want to read: ')
	inputWav = 'PATH_TO_WAV'+wav
	return inputWav

#reading the .wav file (signal file) and extract the information we need 
def initialize(inputWav):
	rate , signal  = wav.read(readWavFile(inputWav)) # returns a wave_read object , rate: sampling frequency 
	sig = wave.open(readWavFile(inputWav))
	# signal is the numpy 2D array with the date of the .wav file
	# len(signal) number of samples
	sampwidth = sig.getsampwidth()
	print 'The sample rate of the audio is: ',rate
	print 'Sampwidth: ',sampwidth	
	return signal ,  rate 

#implementation of the low-pass filter
def lowPassFilter(signal, coeff=0.97):
	return np.append(signal[0], signal[1:] - coeff * signal[:-1]) #y[n] = x[n] - a*x[n-1] , a = 0.97 , a>0 for low-pass filters 


def preEmphasis(wav):
	#taking the signal
	signal , rate = initialize(wav)
	#Pre-emphasis Stage
	preEmphasis = 0.97
	emphasizedSignal = lowPassFilter(signal)
	Time=np.linspace(0, len(signal)/rate, num=len(signal))
	EmphasizedTime=np.linspace(0, len(emphasizedSignal)/rate, num=len(emphasizedSignal))
	return emphasizedSignal, signal , rate

def writeFeatures(mgca_features,wav):
	#write in a txt file the output vectors of every sample
	f = open('mel_generalized_features.txt','a')#sample ID
	#f = open('mfcc_featuresLR.txt','a')#only to initiate the input for the ROC curve
	wav = makeFormat(wav)
	np.savetxt(f,mgca_features,newline=",")
	f.write(wav)
	f.write('\n')
	

def makeFormat(wav):
	#if i want to keep only the gender (male,female)
	wav = wav.split('/')[1].split('-')[1]
	#only to make the format for Logistic Regression
	if (wav=='Female'):
		wav='1'
	else:
		wav='0'
	return wav


def mgca_feature_extraction(wav):
	#I pre-emphasized the signal with a low pass filter
	emphasizedSignal,signal,rate = preEmphasis(wav)
	
	
	#and now I have the signal windowed
	emphasizedSignal*=np.hamming(len(emphasizedSignal))
	
	mgca_features = mgcep(emphasizedSignal,order=12)

	writeFeatures(mgca_features,wav)
		



def mel_Generalized():
	folder = raw_input('Give the name of the folder that you want to read data: ')
	amount = raw_input('Give the number of samples in the specific folder: ')
	print 'Mel-Generalized Cepstrum analysis github implementation '
	for x in range(1,int(amount)+1):
		wav = '/'+folder+'/'+str(x)+'.wav'
		print wav
		mgca_feature_extraction(wav)
		
		

def main():
	mel_Generalized()

main()