Как преобразовать частоты в длины волн в спектрограмме?

Я хочу построить спектрограмму, но вместо частот по оси У отложить длины волн. Их я получаю, деля количество секунд в сигнале на массив частот.

Значения амплитуд и массив частот я получаю из функции coef_map моего класса Spectrogram_builder, которая использует вейвлет-преобразование.

t = np.linspace(0, 1, 2000)
signal = np.sin(2*np.pi*t*5) + np.sin(2*np.pi*t*2) + np.sin(2*np.pi*t*1) + np.sin(2*np.pi*t*10) 
s = Spectrogram_builder(data = signal, start=0, stop=2000)
s, f = s.coef_map(omega0=10.0, min_freq=1, max_freq=100)

scals = len(t)/f
plt.pcolor(t, scals, np.abs(s))
plt.tick_params(axis='both', which='major', labelsize=20)
plt.title('promotors, epsilon = 50')

В итоге, на больших длинах волн (то есть на низких частотах) в спектрограмме образуются широкие полосы, на маленьких длинах волн - узкие полосы.

введите сюда описание изображения

Обычная спектрограмма того же сигнала выглядит вот так:

введите сюда описание изображения

По оси У здесь отложены частоты от 0 до 100

Почему на первой спектрограмме на больших длинах волн образуются широкие полосы? Верна ли такая спектрограмма? И правильно ли я перевёл частоты в длины волн?


Ответы (1 шт):

Автор решения: MBo

Нет, для получения длины волны нужно скорость (света или звука в данной среде) разделить на частоту.

Однако численно ваш результат будет отличаться только масштабным множителем.

То, что ширина полос отличается - нормально. Посмотрите на график гиперболы (здесь) (а частота и длина волны связаны такой же формулой, как y и х) - одинаковые промежутки по X (одна клетка) соответствуют сильно разным интервалам по Y и наоборот.

У вас сетка частот равномерная, соотв. длины волн будут идти неравномерно

→ Ссылка