def one_song_fft(pcm1, song_name, subset=None): # fig, axs = plt.subplots(nrows=2, ncols=1, figsize=(10, 4)) fig, axs = plt.subplots(2, 1, gridspec_kw={'height_ratios': [1, 2]}, figsize=(10, 6)) pcm1 = pcm.into_mono(pcm1)[0:len(pcm1) / 2] if subset: pcm1 = pcm1[subset[0]: subset[1]] x = [i / 44100.0 for i in range(0, len(pcm1))] y = pcm1 axs[0].plot(x, y, color='#006600', lw=0.05, antialiased=True) axs[0].set_ylabel("Amplitude") axs[0].set_xlabel("Time (Seconds)") fft = np.fft.fft(pcm1) fft = fft[0:len(fft)/2] x = [pcm.frequency_at_fft_index(i, len(fft)) for i in range(0, len(fft))] axs[1].set_ylim([-30000, 30000]) axs[1].set_xlim([0, 22000]) axs[1].plot(x, fft, color='#cc0000', lw=0.1, antialiased=True) axs[1].set_ylabel("Amplitude") axs[1].set_xlabel("Frequency (Hz)") fig.tight_layout() if subset: file_path = 'graphs/one_song_fft_' + song_name + '_subset' + '.png' else: file_path = 'graphs/one_song_fft_' + song_name + '.png' print file_path plt.savefig(file_path)
def calculate(self, pcm_data): # calculates the time domain zero crossings pcm_mono = pcm.into_mono(pcm_data) maximum = 0 summ = 0 for sample in pcm_mono: summ += abs(sample) maximum = max(maximum, abs(sample)) return (summ / float(maximum)) / len(pcm_mono)
def calculate(self, pcm_data): sample_pack_size = 1024 pcm_mono = pcm.into_mono(pcm_data) pcm_sample_packs = pcm.to_sample_packs(pcm_mono, sample_pack_size) rolloffs = [] for sample_pack in pcm_sample_packs: rolloffs.append(pcm.roll_off(sample_pack)) rolloff_sd = stats.standard_deviation(rolloffs) return rolloff_sd
def calculate(self, pcm_data): sample_pack_size = 1024 pcm_mono = pcm.into_mono(pcm_data) pcm_sample_packs = pcm.to_sample_packs(pcm_mono, sample_pack_size) centroids = [] for sample_pack in pcm_sample_packs: centroids.append(pcm.centroid(sample_pack)) centroid_sd = stats.standard_deviation(centroids) return centroid_sd
def calculate(self, pcm_data): sample_pack_size = 1024 pcm_mono = pcm.into_mono(pcm_data) pcm_sample_packs = pcm.to_sample_packs(pcm_mono, sample_pack_size) centroids = [] for sample_pack in pcm_sample_packs: centroids.append(pcm.centroid(sample_pack)) centroid_avg = stats.average(centroids) return centroid_avg
def calculate(self, pcm_data): # calculates the time domain zero crossings pcm_mono = pcm.into_mono(pcm_data) noise = 0 for i in range(1, len(pcm_mono)): sign1 = 1 if pcm_mono[i] > 0 else 0 sign0 = 1 if pcm_mono[i - 1] > 0 else 0 noise += abs(sign1 - sign0) return noise
def calculate(self, pcm_data): sample_pack_size = 1024 pcm_mono = pcm.into_mono(pcm_data) pcm_sample_packs = pcm.to_sample_packs(pcm_mono, sample_pack_size) fluxes = [] for i in range(1, len(pcm_sample_packs)): fluxes.append(pcm.spectral_flux(pcm_sample_packs[i - 1], pcm_sample_packs[i])) fluxes_sd = stats.standard_deviation(fluxes) return fluxes_sd
def one_song_fft_sub(pcm1, song_name, subset): fig, axs = plt.subplots(2, 1, gridspec_kw={'height_ratios': [1, 2]}, figsize=(10, 6)) pcm1 = pcm.into_mono(pcm1)[0:len(pcm1) / 2] pcm1 = pcm1[subset[0]: subset[1]] x = [i / 44100.0 for i in range(0, len(pcm1))] y = pcm1 # insert zeros i = 0 while i < len(x): x.insert(i, 0.0) i += 2 axs[0].plot(x, y, color='#006600', lw=1) # axs[0].bar(x, y, color='#006600', width=0.00001, linewidth=0) axs[0].set_ylabel("Amplitude") axs[0].set_xlabel("Time (Seconds)") fft = np.fft.fft(pcm1) fft = fft[0:len(fft)/2] x = range(0, len(fft)) # axs[1].set_ylim([-30000, 30000]) # axs[1].set_xlim([0, 22000]) axs[1].bar(x, fft, color='#cc0000', antialiased=True) axs[1].set_ylabel("Amplitude") axs[1].set_xlabel("Frequency Index") fig.tight_layout() file_path = 'graphs/one_song_fft_' + song_name + '_subset' + '.png' print file_path plt.savefig(file_path)
def calculate(self, pcm_data): pcm_mono = pcm.into_mono(pcm_data) return bpm.determine_bpm(pcm_mono)