Maria@36: # -*- coding: utf-8 -*- Maria@36: """ Maria@36: Created on Fri Sep 1 19:11:52 2017 Maria@36: Maria@36: @author: mariapanteli Maria@36: """ Maria@36: Maria@36: import pytest Maria@36: Maria@36: import numpy as np m@85: import os Maria@36: Maria@36: import scripts.PitchBihist as PitchBihist Maria@36: Maria@36: Maria@36: pbi = PitchBihist.PitchBihist() m@85: TEST_MELODIA_FILE = os.path.join(os.path.dirname(__file__), os.path.pardir, m@85: 'data', 'sample_dataset', 'Melodia', 'mel_1_2_1.csv') Maria@36: Maria@36: def test_hz_to_cents(): Maria@36: freq_Hz = np.array([32.703, 65.406, 55, 110]) Maria@36: freq_cents = pbi.hz_to_cents(freq_Hz) Maria@36: freq_cents_true = np.array([0, 1200, 900, 2100]) Maria@36: assert np.array_equal(freq_cents, freq_cents_true) Maria@36: Maria@36: Maria@36: def test_wrap_to_octave(): Maria@36: cents = np.array([900, 2100, 1200]) Maria@36: octave_cents = pbi.wrap_to_octave(cents) Maria@36: octave_cents_true = np.array([900, 900, 0]) Maria@36: assert np.array_equal(octave_cents, octave_cents_true) Maria@36: Maria@36: Maria@36: def test_get_melody_from_file(): m@85: melodia_file = TEST_MELODIA_FILE Maria@36: melody = pbi.get_melody_from_file(melodia_file) Maria@37: assert len(melody) < 12. * pbi.melody_sr Maria@36: Maria@36: Maria@36: def test_get_melody_matrix(): Maria@36: melody = 440 * np.ones(1000) Maria@36: melody_matrix = pbi.get_melody_matrix(melody) Maria@36: n_frames = melody_matrix.shape[1] Maria@36: assert np.array_equal(melody_matrix[45, :], np.ones(n_frames)) Maria@36: Maria@36: Maria@39: def test_second_frame_decomposition(): Maria@39: norigframes = 100 Maria@39: nframes, win2, hop2 = pbi.second_frame_decomposition(norigframes) Maria@39: assert nframes == 1 Maria@39: Maria@39: Maria@39: def test_second_frame_decomposition(): Maria@39: norigframes = np.ceil(pbi.melody_sr * 16.) Maria@39: nframes, win2, hop2 = pbi.second_frame_decomposition(norigframes) Maria@39: # for 16-sec segment with .5 hop size expect ~16 frames round up Maria@39: assert nframes == 17 Maria@39: Maria@39: Maria@36: def test_bihist_from_melodia(): m@85: melodia_file = TEST_MELODIA_FILE Maria@36: bihist = pbi.bihist_from_melodia(melodia_file, secondframedecomp=False) Maria@36: assert bihist.shape == (60, 60) Maria@36: Maria@36: Maria@36: def test_bihist_from_melodia_n_frames(): m@85: melodia_file = TEST_MELODIA_FILE Maria@36: bihist = pbi.bihist_from_melodia(melodia_file, secondframedecomp=True) Maria@36: dur_sec = 11.5 # duration of first file in metadata.csv is > 11 seconds Maria@36: n_frames_true = np.round((dur_sec - pbi.win2sec) * 2) # for .5 sec hop size Maria@36: assert bihist.shape[1] == n_frames_true Maria@36: Maria@36: Maria@36: def test_bihistogram(): Maria@36: melody = 440 * np.ones(1000) Maria@36: melody_matrix = pbi.get_melody_matrix(melody) Maria@36: bihist = pbi.bihistogram(melody_matrix, align=False) Maria@36: assert np.array_equal(bihist, np.zeros((60, 60))) Maria@36: Maria@36: Maria@36: def test_bihistogram_values(): Maria@36: melody = np.concatenate([440 * np.ones(500), 32.703 * np.ones(500)]) Maria@36: melody_matrix = pbi.get_melody_matrix(melody) Maria@36: # melody transitions from A to C (bin 45/60 to bin 0/60) Maria@36: bihist = pbi.bihistogram(melody_matrix, align=False) Maria@36: # expect only element [45, 0] to be non-zero Maria@36: assert bihist[45, 0] > 0 and (np.sum(bihist) - bihist[45, 0]) == 0 Maria@36: Maria@36: Maria@37: def test_bihistogram_align(): Maria@37: melody = np.concatenate([660 * np.ones(250), 440 * np.ones(500)]) Maria@37: melody_matrix = pbi.get_melody_matrix(melody) Maria@37: # bin of max magnitude = A = 45/60 Maria@37: bihist = pbi.bihistogram(melody_matrix, align=True) Maria@37: # bihist[20, 45] == 0 Maria@37: # we shift up 45 so rows 20-45 and left 45 so cols 45-45 Maria@37: assert bihist[20-45, 0] == 1