mfcc.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import numpy as np
  2. import cmsisdsp.datatype as dt
  3. def frequencyToMelSpace(freq):
  4. return 1127.0 * np.log(1.0 + freq / 700.0)
  5. def melSpaceToFrequency(mels):
  6. return 700.0 * (np.exp(mels / 1127.0) - 1.0)
  7. def melFilterMatrix(dtype,fmin, fmax, numOfMelFilters,fs,FFTSize):
  8. filters = np.zeros((numOfMelFilters,int(FFTSize/2+1)))
  9. zeros = np.zeros(int(FFTSize // 2 ))
  10. fmin_mel = frequencyToMelSpace(fmin)
  11. fmax_mel = frequencyToMelSpace(fmax)
  12. mels = np.linspace(fmin_mel, fmax_mel, num=numOfMelFilters+2)
  13. linearfreqs = np.linspace( 0, fs/2.0, int(FFTSize // 2 + 1) )
  14. spectrogrammels = frequencyToMelSpace(linearfreqs)[1:]
  15. filtPos=[]
  16. filtLen=[]
  17. totalLen = 0
  18. packedFilters = []
  19. for n in range(numOfMelFilters):
  20. upper = (spectrogrammels - mels[n])/(mels[n+1]-mels[n])
  21. lower = (mels[n+2] - spectrogrammels)/(mels[n+2]-mels[n+1])
  22. filters[n, :] = np.hstack([0,np.maximum(zeros,np.minimum(upper,lower))])
  23. nb = 0
  24. startFound = False
  25. for sample in filters[n, :]:
  26. if not startFound and sample != 0.0:
  27. startFound = True
  28. startPos = nb
  29. if startFound and sample == 0.0:
  30. endPos = nb - 1
  31. break
  32. nb = nb + 1
  33. filtLen.append(endPos - startPos+1)
  34. totalLen += endPos - startPos + 1
  35. filtPos.append(startPos)
  36. packedFilters += list(filters[n, startPos:endPos+1])
  37. return filtLen,filtPos,dt.convert(packedFilters,dtype)
  38. def dctMatrix(dtype,numOfDctOutputs, numOfMelFilters):
  39. result = np.zeros((numOfDctOutputs,numOfMelFilters))
  40. s=(np.linspace(1,numOfMelFilters,numOfMelFilters) - 0.5)/numOfMelFilters
  41. for i in range(0, numOfDctOutputs):
  42. result[i,:]=np.cos(i * np.pi*s) * np.sqrt(2.0/numOfMelFilters)
  43. return dt.convert(result.reshape(numOfDctOutputs*numOfMelFilters),dtype)