view trunk/swig/audio_example.py @ 453:649c3390301e

small bug in /swig/audio_example.py
author hamel.phil
date Thu, 13 Jan 2011 18:49:40 +0000
parents 913d13255f61
children
line wrap: on
line source
#!/usr/bin/env python
#
#  audio_example.py
#  
#
#  Created by Philippe Hamel (hamel.phil@gmail.com) on 10-12-22.
#
# Script to extract SAIs from an audio file using python

import aimc
import numpy
from copy import copy

def get_strobe_matrix(strobes,buf_len = 1024):
	n_channel = len(strobes)
	strobe_mat = numpy.zeros((n_channel,buf_len))
	for ch in range(n_channel):
		for s in strobes[ch]:
			strobe_mat[ch,s] = 1.
	return strobe_mat


do_plot=False
# Example wav file
wavfile = '../test_data/short_example.wav'

#Loading audio file
try:
	#pygmy is available at hg clone https://bitbucket.org/douglaseck/pygmy/
	from pygmy.io.audio import AudioFile
	af=AudioFile(wavfile)
	x,sr,z=af.read(mono=True)
except:
	from scipy.io import wavfile as WF
	(sr,x) = WF.read(wavfile)
	x=x.astype('float')/float(pow(2,15) - 1)

if x.ndim <= 1:
	x=numpy.reshape(x,(x.shape[0],1))
sr = 1.*sr
	
nChannels = x.shape[1]

nSamples = x.shape[0]
buffer_length = 1024

#Zero-padding
#zero_pad = numpy.zeros((buffer_length-(nSamples%buffer_length),nChannels)).astype('float')
#x = numpy.vstack((x,zero_pad))

#OR

#Drop last incomplete frame (this is what happens in the C++ code)
nFrames = x.shape[0]/buffer_length
x = x[:nFrames*buffer_length]

assert(x.shape[0]%buffer_length == 0)


sig = aimc.SignalBank()
sig.Initialize(nChannels,buffer_length,sr)

pzfc = aimc.ModulePZFC(aimc.Parameters())
hcl = aimc.ModuleHCL(aimc.Parameters())
local_max = aimc.ModuleLocalMax(aimc.Parameters())
sai = aimc.ModuleSAI(aimc.Parameters())

pzfc.AddTarget(hcl)
hcl.AddTarget(local_max)
local_max.AddTarget(sai)

global_params = aimc.Parameters()
pzfc.Initialize(sig,global_params)

output_list = []
strobe_list = []
centre_freq_list=[]

for f in range(nFrames):
	for i in range(nChannels):
		sig.set_signal(i,x[buffer_length*f:buffer_length*(f+1),i])

	pzfc.Process(sig)
	output_bank = sai.GetOutputBank()
	n_channel = output_bank.channel_count()
	sig_length = output_bank.buffer_length()
	output_matrix = numpy.zeros((n_channel,sig_length))
	strobes=[]
	freqs=[]
	for i in range(n_channel):
		output_matrix[i] = numpy.array(output_bank.get_signal(i))
		freqs.append(output_bank.centre_frequency(i))
		channel_strobes = [] 
		for j in range(output_bank.strobe_count(i)):
			channel_strobes.append(output_bank.strobe(i,j))
		strobes.append(channel_strobes)
	centre_freq_list.append(freqs)
	strobe_list.append(strobes)
	output_list.append(output_matrix)
#	P.figure()
#	P.imshow(output_matrix, aspect='auto', origin='lower')


print 'nFrames, nChannels, nSamples, sample_rate'
print nFrames, n_channel, sig_length, sr


if do_plot:
	import pylab as P
	P.figure()
	P.imshow(output_list[0], aspect='auto', origin='lower')


################ DEPRECATED CODE (kept here for reference) #########################

#if True:
#	output_bank=output_list[0]
#	n_channel = output_bank.channel_count()
#	sig_length = output_bank.buffer_length()
#	output_matrix = numpy.zeros((n_channel,sig_length))
#	for i in range(n_channel):
#		output_matrix[i] = numpy.array(output_bank.get_signal(i))
#	print output_matrix
#	print output_matrix.shape
#	print output_matrix.sum()

#output_signal = numpy.array(output_bank.get_signal(0))

#def process_module(module, input_signal, global_params):
#	module.Initialize(input_signal,global_params)
#	module.Process(input_signal)
#	return module.GetOutputBank()

#pzfc_params = aimc.Parameters()
##pzfc_params.SetString('name','PZFCFilterBank')
##pzfc_params.SetString('child1','NAP')
#
#hcl_params = aimc.Parameters()
##hcl_params.SetString('name','NAP')
##hcl_params.SetString('child1','NAP')
#
#global_params = aimc.Parameters()
#
#pzfc = aimc.ModulePZFC(pzfc_params)
#pzfc.Initialize(sig,global_params)
#pzfc.Process(sig)
#pzfc_output = pzfc.GetOutputBank()
#
#hcl = aimc.ModuleHCL(hcl_params)
#hcl_output = process_module(hcl, pzfc_output, global_params)
#
#local_max = aimc.ModuleLocalMax( aimc.Parameters())
#local_max_output = process_module(local_max, hcl_output, global_params)
#
#sai = aimc.ModuleSAI( aimc.Parameters())
#sai_output = process_module(sai, local_max_output, global_params)