Как определить порядок фильтра в коэффициентах линейного прогнозирования (LP C) при расчете формантных частотных характеристик? - PullRequest
1 голос
/ 30 апреля 2020

Я новичок в обработке сигналов и пытаюсь вычислить особенности частоты формант для различных файлов .wav.

Для вычисления частоты форманты мне нужны три значения параметров:

  • Линейное прогнозирование Коэффициенты (LP C)
  • root
  • angle

Я пытаюсь рассчитать коэффициенты линейного прогнозирования (LP C), используя librosa.core .lp c in python. он принимает два параметра:

librosa.core.lpc(y, order)

У меня есть Y, но я не знаю, как рассчитать порядок, у меня много WAV-файлов, и мне нужно установить порядок, чтобы извлечь объекты из всех файлов. Как определить порядок для всех файлов WAV для расчета LP C?

Следующие две вещи root и угол можно легко рассчитать так:

 rts = numpy.roots(A)
 rts = [r for r in rts if numpy.imag(r) >= 0]

angz = numpy.arctan2(numpy.imag(rts), numpy.real(rts))

# Get frequencies.
Fs = spf.getframerate()
frqs = sorted(angz * (Fs / (2 * math.pi)))

Заранее спасибо !

1 Ответ

2 голосов
/ 30 апреля 2020

Нет точной науки о порядке LP C, который следует использовать, хотя есть два эмпирических правила:

  1. В два раза больше ожидаемых формантов, плюс два. Объяснение, приведенное в Систематические c ошибки в анализе формант стационарных гласных : , каждый формант соответствует затухающей синусоиде, которая может быть захвачена парой корней с правильной частотой и демпфирование (один из корней является комплексным сопряжением другого). Есть два дополнительных коэффициента, которые «на всякий случай» поглощают любую оставшуюся энергию в сигнале

  2. Частота дискретизации в кГц. Если Fs=16000 то есть 16kHz, установите порядок на 16.

Первый метод выглядит несколько более популярным и описан, например, на странице Mathworks .

Замечание по оптимизации

Не имеет отношения к вопросу, но я не удержался и предложил два небольших изменения кода, чтобы сделать его более numpy:

import numpy as np
import librosa

A = librosa.core.lpc(y, 12)
rts = np.roots(A)
rts = rts[np.imag(rts) >= 0]
angz = np.arctan2(np.imag(rts), np.real(rts))
frqs = angz * fs / (2 *  np.pi)
frqs.sort()
...