Спектр мощности wav файла с использованием Python

Я пытался загрузить волновой файл и распечатать его спектр с помощью преобразования Фурье. Я последовал за какой-то книгой, которую нашел, и получил оттуда код, но результат немного другой.

def read_wave(filename):

    fp=wave.open(filename,'r') 
    nchannels=fp.getnchannels()
    framerate=fp.getframerate()
    nframes=fp.getnframes()
    sampwidth=fp.getsampwidth()

    z_str=fp.readframes(nframes)
    fp.close()

    dtype_map = {1:np.uint8,2:np.uint16}
    ys=np.frombuffer(z_str,dtype=dtype_map[sampwidth])

    waveObject=Wave(ys,framerate=framerate)

    return waveObject


class Wave:

    def __init__(self,ys,ts=None,framerate=None):

        # ys:wave array
        # ts:array of time


        self.ys=np.asanyarray(ys)
        self.framerate=framerate

        if ts is None:
            self.ts =np.arange(len(ys))/self.framerate
        else:
            self.ts=ts

    def make_spectrum(self):

        n=len(self.ys);
        d=1/self.framerate;

        hs = np.fft.rfft(self.ys)
        fs = np.fft.rfftfreq(n, d)



        return Spectrum(hs,fs,self.framerate)

class Spectrum:

    def __init__(self,hs,fs,framerate):

        # hs : array of amplitudes (real or complex)
        # fs : array of frequencies

        self.hs=np.asanyarray(hs)
        self.fs=np.asanyarray(fs)
        self.framerate=framerate

    @property
    def amps(self):
        return np.absolute(self.hs)

    def plot(self, high=None):

       plt.plot(self.fs, self.amps)

data=read_wave('hate.wav') <br>
spectrum=data.make_spectrum()<br>
spectrum.plot()<br>

Но спектр, который я получаю, выглядит так, и не выглядит правильным, какая-нибудь помощь?

Спектр мощности wav файла с использованием Python

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
800
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Имеется огромный пик на ж  =  0, который указывает, что сигнал имеет постоянное смещение.

Это может быть связано с использованием беззнаковых целочисленных типов:

dtype_map = {1:np.uint8,2:np.uint16}

Попробуйте использовать знаковый тип или вычтите из сигнала среднее значение, чтобы удалить смещение.

Ага, это была проблема. Использование подписанного типа решило это, спасибо.

Tenshi 07.12.2018 12:21

Я пытаюсь скопировать это, что мне нужно изменить в вашем коде, чтобы он заработал?

jackjameshoward 25.02.2019 10:53

8-битные отсчеты без знака, хранящиеся в файлах WAVE, находятся в диапазоне от 0 до 255 и, следовательно, имеют смещение по постоянному току. Ваш БПФ показывает это смещение постоянного тока с огромным всплеском в начале. Вычитание смещения постоянного тока (должно быть 128 или значение где-то около 128 из-за ошибок записи) из каждой выборки удалит огромный всплеск смещения постоянного тока из БПФ и позволит автоматизировать масштабирование графика, чтобы лучше показать другие элементы разрешения по частоте.

16-битные выборки в файлах WAVE имеют формат целого числа со знаком, поэтому чтение их как значений без знака может привести к повреждению данных.

Ага, это была проблема. Использование подписанного типа решило это, спасибо.

Tenshi 07.12.2018 12:21

Другие вопросы по теме