Поліпшення роздільної здатності спектрограми в Python?


21

Я використовую specgram()функцію matplotlibдля генерування спектрограм файлів мовної хвилі в Python, але вихід завжди значно поступається якості тому, що може створити моє звичайне програмне забезпечення для транскрипції, Praat. Наприклад, такий дзвінок:

specgram(
    fromstring(spf.readframes(-1), 'Int16'),
    Fs=framerate,
    cmap=cm.gray_r,
)

Це створює:

введіть тут опис зображення

У той час як Praat працює над тим же зразком звуку з такими налаштуваннями:

  • Діапазон перегляду: 0-8000Гц
  • Довжина вікна: 0,005с
  • Динамічний діапазон: 70 дБ
  • Часові кроки: 1000
  • Частота кроків: 250
  • Форма вікна: Гаусса

Це створює:

введіть тут опис зображення

Що я роблю неправильно? Я спробував зіткнутися з усіма specgram()параметрами, але, здається, ніщо не покращило роздільну здатність. Я практично не маю досвіду роботи з FFT.


Чи можете ви надати приклад налаштованих вами параметрів matplotlib.specgram? Ви даєте дуже конкретний приклад параметрів для Praat, але не показуєте однакову конфігурацію для matplotlib.specgram?
Крістофер Фелтон

Відповіді:


11

Ось параметри matplotlib.specgram

matplotlib.mlab.specgram(x, 
                         NFFT=256, 
                         Fs=2, 
                         detrend=<function detrend_none at 0x1dd6410>, 
                         window=<function window_hanning at 0x1e0b1b8>, 
                         noverlap=128, 
                         pad_to=None, 
                         sides='default', 
                         scale_by_freq=None)

Параметри, наведені в описі запитання, потрібно перетворити на порівнянні параметри mpl.specgram. Далі наведено приклад відображення:

View range: 0-8000Hz            Fs=16000
Window length: 0.005s           NFFT = int(Fs*0.005) = 80
                                noverlap = int(Fs*0.0025) = 40
Dynamic range: 70dB             n/a
Time steps: 1000                n/a
Frequency steps: 250            
Window shape: Gaussian          default window is hanning change to gaussian

Якщо ви використовуєте 8 мс, ви отримаєте потужність 2 FFT (128). Далі йде опис налаштувань Praat з їх веб-сайту

Діапазон перегляду (Гц) : діапазон частот для відображення. Стандартний - 0 Гц внизу і 5000 Гц вгорі. Якщо ця максимальна частота перевищує частоту Найквіста звуку (що становить половину його частоти дискретизації), деякі значення в спектрограмі будуть нульовими, а більш високі частоти будуть намальовані білим кольором. Це можна побачити, якщо ви записуєте звук у 44100 Гц і встановлюєте діапазон перегляду від 0 Гц до 25000 Гц.

Довжина вікна : тривалість вікна аналізу. Якщо це 0,005 секунди (стандарт), Praat використовує для кожного кадру ту частину звуку, яка лежить між 0,0025 секундами до і 0,0025 секунд після центру цього кадру (для Gaussian windows Praat фактично використовує трохи більше, ніж це). Довжина вікна визначає пропускну здатність спектрального аналізу, тобто ширину горизонтальної лінії в спектрограмі чистої синусоїди (див. Нижче). Для вікна Гаусса пропускна здатність -3 дБ становить 2 * sqrt (6 * ln (2)) / (π * довжина вікна), або 1,22982804 / довжина вікна. Щоб отримати broad-band' spectrogram (bandwidth 260 Hz), keep the standard window length of 5 ms; to get aвузькосмугову спектрограму (смуга пропускання 43 Гц), встановіть її на 30 мс (0,03 секунди). Інші форми вікон дають дещо інші значення.

Динамічний діапазон (дБ) : Усі значення, що перевищують динамічний діапазон дБ нижче максимального (можливо після динамічного стиснення, див. Розширені настройки спектрограми ...), будуть намальовані білим кольором. Значення між ними мають відповідні відтінки сірого. Таким чином, якщо найвищий пік спектрограми має висоту 30 дБ / Гц, а динамічний діапазон - 50 дБ (що є стандартним значенням), то значення нижче -20 дБ / Гц будуть виведені білим кольором, а значення між -20 дБ / Гц і 30 дБ / Гц будуть намальовані різними відтінками сірого.

Посилання на налаштування Praat

Питання ОП може стосуватися різниці контрасту між спектром Праат та спектром mpl (matplotlib). Praat має налаштування динамічного діапазону , яке впливає на контраст. Функція mpl не має аналогічних параметрів / параметрів. Mpl.specgram повертає 2D масив рівнів потужності (спектрограма), який динамічний діапазон може бути застосований до масиву повернення та повторно побудований.

Далі наведено фрагмент коду для створення графіків нижче. Приклад - мовлення ~ 1m15s з щебетанням від 20Гц до 8000Гц.

import numpy
import pylab
import wave
import array
pylab.close('all')
w1 = wave.open('example_no_noise.wav')
w2 = wave.open('example_noise.wav')
# hmmm, probably a better way to do this, scipy.io function?
x1 = numpy.array(array.array('h', w1.readframes(w1.getnframes())))
x2 = numpy.array(array.array('h', w2.readframes(w2.getnframes())))
x1 = x1 / (2.**(16-1))  # normalize
x2 = x2 / (2.**(16-1))  # normalize
Fs = 16000.
NFFT = int(Fs*0.005)  # 5ms window
noverlap = int(Fs*0.0025)
pylab.figure(1)
pylab.specgram(x1, NFFT=NFFT, Fs=Fs, noverlap=noverlap, 
               cmap=pylab.get_cmap('Greys'))
pylab.title('Full 1m15s example min noise')
pylab.figure(2)
pylab.specgram(x2, NFFT=NFFT, Fs=Fs, noverlap=noverlap, 
               cmap=pylab.get_cmap('Greys'))
pylab.title('Full 1m15s example more noise')
pylab.figure(3); n=2100*176;
pylab.specgram(x2[n:n+256*256], NFFT=NFFT, Fs=Fs, noverlap=noverlap, 
               cmap=pylab.get_cmap('Greys'))
pylab.title('Full ~4s example min noise')
pylab.figure(4); pylab.plot(x1[n:n+256*256])


1
Якщо подумати над цим трохи більше, параметр «Динамічний діапазон» Praat може бути головним фактором різниці в тому, як виглядають сюжети. "Динамічний діапазон" Praat може обмежувати діапазон (стискаючи), щоб отримати більший контраст у графіці. BOMK MPL не має подібної функції, але її можна додати.
Крістофер Фелтон

6

Здається, це проблема з врегулюванням часу / частоти. Ваш Praat сюжет має гіршу роздільну частоту (ви навіть не можете чітко бачити гармоніки) і кращу часову роздільну здатність. Спробуйте зменшити розмір вікна (NFFT) до 16000 х 0,05 = 80 зразків. Я б запропонував використовувати більшу потужність у 2 у pad_to (128 або 256).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.