I am trying to plot the frequnecy spectrum of my wav file data. I get a list of complex numbers and by testing with smaller numbers, I know the values are correct. But, I don't know how to plot. I just know I am supposed to get something like small barcharts, that are supposed be symmetrical. But my graph it's not. Below is my code and current plot.

from scipy.io.wavfile import read
import numpy as np
import matplotlib.pyplot as plt
import math

df = read('matches-4.wav')
data = np.array(df[1], dtype=float)[:, 1][2000:2512]  # using right channel


def discrete_fourier_transformation():
    c = []
    for k in data:
        summation = 0
        for j in data:
            summation += j * math.e ** (-1j * (2 * math.pi / len(data)) * j * k)
        c.append(abs(1 / len(data) * summation))
    return c


values = discrete_fourier_transformation()
plt.plot(values)
plt.show()

enter image description here

1 Answers

1
SleuthEye On Best Solutions

You are not getting the expected symmetry out of your graph because of a problem in your implementation of the Discrete Fourier Transformation.

More specifically, in your Discrete Fourier Transformation implementation the complex exponential should include multiplication by integer factors, which I imagine is what you tried to do with j and k. However the way you configured your loops the j and k values are the actual data values. To fix this you should update your loops to go over the range(0,len(data) range with the following:

def discrete_fourier_transformation():
    c = []
    for k in range(0,len(data)):
        summation = 0
        for j in range(0,len(data)):
            summation += data[j] * math.e ** (-1j * (2 * math.pi / len(data)) * j * k)
        c.append(abs(1 / len(data) * summation))
    return c