def runTest(self): ''' time to test the fingerprinting scheme, create a base with 200 atoms for 8 songs, then Construct the histograms and retrieve the fileIndex and time offset that is the most plausible ''' print "------------------ Test5 DB construction ---------" # # create the base : persistent ppdb = STFTPeaksBDB('LargeSTFTPeaksdb.db', load=False, time_res=0.2) print ppdb segDuration = 5 sig = LongSignal(op.join(audio_files_path, file_names[0]), frame_duration=segDuration, mono=False, Noverlap=0) segmentLength = sig.segment_size max_seg_num = 5 # " run sketchifier on a number of files" nbFiles = 8 keycount = 0 for fileIndex in range(nbFiles): RandomAudioFilePath = file_names[fileIndex] print fileIndex, RandomAudioFilePath if not (RandomAudioFilePath[-3:] == 'wav'): continue pySig = LongSignal(op.join(audio_files_path, RandomAudioFilePath), frame_size=segmentLength, mono=False, Noverlap=0) sk = sketch.STFTPeaksSketch(**{'scale': 512, 'step': 128}) nbSeg = int(pySig.n_seg) print 'Working on ' + str(RandomAudioFilePath) + ' with ' + str( nbSeg) + ' segments' for segIdx in range(min(nbSeg, max_seg_num)): pySigLocal = pySig.get_sub_signal(segIdx, 1, True, True, channel=0, pad=0) print "sketchify the segment %d" % segIdx # run the decomposition sk.recompute(pySigLocal) sk.sparsify(200) fgpt = sk.fgpt() print "Populating database with offset " + str( segIdx * segmentLength / sig.fs) ppdb.populate(fgpt, sk.params, fileIndex) # keycount += approx.atom_number print ppdb.get_stats()
def runTest(self): ppdb = STFTPeaksBDB('tempdb.db', load=False, persistent=True, time_max=500.0) pySig = LongSignal(op.join(audio_files_path, file_names[0]), frame_duration=5, mono=False, Noverlap=0) self.assertEqual(pySig.segment_size, 5.0 * pySig.fs) max_nb_seg = 10 nb_atoms = 400 sk = sketch.STFTPeaksSketch(**{'scale': 512, 'step': 128}) for segIdx in range(min(max_nb_seg, pySig.n_seg)): pySigLocal = pySig.get_sub_signal(segIdx, 1, mono=True, normalize=False, channel=0, pad=0) print "sketchify segment %d" % segIdx # run the decomposition sk.recompute(pySigLocal) sk.sparsify(nb_atoms) fgpt = sk.fgpt() print "Populating database with offset " + str( segIdx * pySig.segment_size / pySig.fs) ppdb.populate(fgpt, sk.params, 0, offset=segIdx * pySig.segment_size / pySig.fs) # ok we have a DB with only 1 file and different segments, now nb_test_seg = 15 long_sig_test = LongSignal(op.join(audio_files_path, file_names[0]), frame_duration=5, mono=False, Noverlap=0.5) count = 0 for segIdx in range(min(nb_test_seg, long_sig_test.n_seg)): pySigLocal = long_sig_test.get_sub_signal(segIdx, 1, mono=True, normalize=False, channel=0, pad=0) # print "MP on segment %d" % segIdx # run the decomposition sk.recompute(pySigLocal) sk.sparsify(nb_atoms) fgpt = sk.fgpt() histograms = ppdb.retrieve(fgpt, sk.params, offset=0, nbCandidates=1) maxI = np.argmax(histograms[:]) OffsetI = maxI / 1 estFileI = maxI % 1 oracle_value = segIdx * long_sig_test.segment_size * ( 1 - long_sig_test.overlap) / long_sig_test.fs print "Seg %d Oracle: %1.1f - found %1.1f" % (segIdx, oracle_value, OffsetI) if abs(OffsetI - oracle_value) < 5: count += 1 glob = float(count) / float(min(nb_test_seg, long_sig_test.n_seg)) print "Global Score of %1.3f" % glob self.assertGreater(glob, 0.8)
# Now load the long version from PyMP.signals import LongSignal seg_size = 5*8192 long_signal = LongSignal(op.join(os.environ['PYMP_PATH'],'data/Bach_prelude_40s.wav'), seg_size, mono=True, Noverlap=0.5) # decomposing the long signal apps, decays = mp.mp_long(long_signal, dico, target_srr, max_atom_num) dists = np.zeros((long_signal.n_seg, len(apps))) mp._initialize_fftw(apps[0].dico, max_thread_num=1) for idx in range(long_signal.n_seg): for jdx in range(idx): # test all preceeding segments only target_sig = long_signal.get_sub_signal(idx, 1, mono=True, pad=dico.get_pad(),fast_create=True) dists[idx,jdx] = joint_coding_distortion(target_sig, apps[jdx],max_rate,1024, initfftw=False) mp._clean_fftw() plt.figure() plt.imshow(dists) plt.colorbar() plt.show()