def main(): wave_data, wave_params = read_wave_data(IN_FILENAME) fft_util = FftUtil(1024) freq_domain_data = fft_util.analysis(wave_data) plot_spectrogram(freq_domain_data, wave_params.framerate, 'Unaltered freq domain data') spectrogram_data = reduce_to_spectrogram_data(freq_domain_data) plot_spectrogram(spectrogram_data, wave_params.framerate, "Spectrogram data") expanded_spectrogram_data = expand_from_spectrogram_data(spectrogram_data) plot_spectrogram(expanded_spectrogram_data, wave_params.framerate, "Expanded spectrogram data") lg_freq_domain, lg_signal = lim_griffen_reconstruction(spectrogram_data, wave_params) plot_spectrogram(lg_freq_domain, wave_params.framerate, "Lim Griffen reconstruction") reconverted_audio = fft_util.resynthesis(freq_domain_data) reconverted_spectrogram_data = fft_util.resynthesis(expanded_spectrogram_data) write_wave_data(OUT_FILENAME, reconverted_spectrogram_data, wave_params) print("L2-norm of original audio and resynthesis of unmodified data: ", np.linalg.norm(wave_data - reconverted_audio)) print("L2-norm of original audio and resynthesis of spectrogram_data data: ", np.linalg.norm(wave_data - reconverted_spectrogram_data)) print("L2-norm of original audio and lim griffen reconstruction: ", np.linalg.norm(wave_data - lg_signal)) plot_comparison(wave_data, lg_signal)
def lim_griffen_reconstruction(spectrogram_data, wave_params): magnitude_data = expand_from_spectrogram_data(spectrogram_data) half_window = spectrogram_data.shape[1]-1 fft_util = FftUtil(half_window * 2) length_of_audio = (magnitude_data.shape[0] + 1) * half_window output_signal = np.random.rand(length_of_audio) for i in range(101): output_freq_domain = fft_util.analysis(output_signal) output_signal = fft_util.resynthesis(magnitude_data * np.exp(np.angle(output_freq_domain) * 1j)) if i % 10 == 0: output_filename = "iter_" + str(i) + ".wav" write_wave_data(output_filename, output_signal, wave_params) return (output_freq_domain, output_signal)
def test_analysis_resynthesis(): fft_util = FftUtil(1024) wave_data, wave_params = read_wave_data(IN_FILENAME) complex_data = fft_util.analysis(wave_data) output = fft_util.resynthesis(complex_data) write_wave_data(OUT_FILENAME, output, wave_params)