Contact
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutSign UpSign In
| Download
Project: Peter's Files
Views: 3893
Visibility: Unlisted (only visible to those who know the link)
Image: ubuntu1804
Kernel: Python 3 (system-wide)

Analyzing Audio Files

Using Discrete Fourier-like and Haar-like Transforms
import numpy as np import IPython from scipy.io import wavfile import matplotlib.pyplot as plt import wave import os

Functions

def cutoff(y,h): return np.array([el if abs(el) > h else 0 for el in y]) def normalize(vec): if (vec == 0).all(): raise ValueError('Not possilbe to normalize.') return vec / np.sqrt(sum(vec**2))
def haar_matrix(N): AT = np.zeros((2**N, 2**N)) row = 0 for e in range(1,N+2): s = 2**e col = 0 while col < 2**N: AT[row][col:int(col+s/2)] = 1 AT[row][int(col+s/2):int(col+s)] = -1 row += 1 col += s return np.array([normalize(row) for row in AT]).transpose()
haar_matrix(2)
array([[ 0.70710678, 0. , 0.5 , 0.5 ], [-0.70710678, 0. , 0.5 , 0.5 ], [ 0. , 0.70710678, -0.5 , 0.5 ], [ 0. , -0.70710678, -0.5 , 0.5 ]])
def fourier_matrix(N): A = np.array([[1]]) size = 1 while size < 2**N: same = np.vstack([A,A]).transpose() flip = np.vstack([A,-1*A]).transpose() A = np.vstack([same,flip]).transpose() size = len(A) return A / np.sqrt(2**N)
fourier_matrix(2)
array([[ 0.5, 0.5, 0.5, 0.5], [ 0.5, -0.5, 0.5, -0.5], [ 0.5, 0.5, -0.5, -0.5], [ 0.5, -0.5, -0.5, 0.5]])

Using the functions

N = 10 fs, data = wavfile.read('440+367.wav') x = data[230_000:230_000 + 2**N].transpose()[0]
sampleRate = 44100.0 # hertz obj = wave.open('input.wav','w') obj.setnchannels(1) # mono obj.setsampwidth(2) obj.setframerate(sampleRate) for i in range(len(x)): obj.writeframesraw(x[i]) obj.close()
IPython.display.Audio("input.wav")
fig, ax = plt.subplots(figsize=(20,10)) ax.plot(x,'k');
Image in a Jupyter notebook
pre = fourier_matrix(N).transpose() @ x
max(pre)
70871.03125
y = fourier_matrix(N) @ cutoff(pre, 4000)
sampleRate = 44100.0 # hertz obj = wave.open('output.wav','w') obj.setnchannels(1) # mono obj.setsampwidth(2) obj.setframerate(sampleRate) for i in range(len(y)): obj.writeframesraw(y[i]) obj.close()
IPython.display.Audio("output.wav")
fig, ax = plt.subplots(figsize=(20,10)) ax.plot(y,'r'); ax.plot(x,'k');
Image in a Jupyter notebook