from __future__ import division
from scikits.talkbox import segment_axis
import numpy as np
import soundfile as sf
def readwav(fn):
signal, sampleRate = sf.read(fn)
signal -= np.mean(signal)
signal /= np.max(np.abs(signal))# Normalize the amplitude
nframes = len(signal)
return signal, sampleRate, nframes
# smoother version of hanning window
def sqrt_hann(M):
return np.sqrt(np.hanning(M))
# signal: 1D array, returns a 2D complex array
def pro_signal(signal, window = 'hanning', frame_len = 1024, overlap = 512):
if window == 'hanning':
# w = np.hanning(frame_len)
w = sqrt_hann(frame_len)
else:
w = window
y = segment_axis(signal, frame_len , overlap = overlap, end = 'cut')# use cut instead of pad
y = w * y
return y
# signal is a 2d matrix, n_frames * frame_len
# returns a 2d matrix, n_frames * frame_len /2 + 1
def stft(signal):
out = np.array([np.fft.rfft(signal[i]) for i in xrange(signal.shape[0])])
return out
# Load the signal
fn = 'lullaby.wav'
signal, sampleRate, nframes = readwav(fn)
print sampleRate, nframes
snd = pro_signal(signal, frame_len = 1024, overlap = 512)
out = stft(snd)
print out.shape