Как преобразовать частоты в длины волн в спектрограмме?
Я хочу построить спектрограмму, но вместо частот по оси У отложить длины волн. Их я получаю, деля количество секунд в сигнале на массив частот.
Значения амплитуд и массив частот я получаю из функции 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 шт):
Нет, для получения длины волны нужно скорость (света или звука в данной среде) разделить на частоту.
Однако численно ваш результат будет отличаться только масштабным множителем.
То, что ширина полос отличается - нормально. Посмотрите на график гиперболы (здесь) (а частота и длина волны связаны такой же формулой, как y и х) - одинаковые промежутки по X (одна клетка) соответствуют сильно разным интервалам по Y и наоборот.
У вас сетка частот равномерная, соотв. длины волн будут идти неравномерно

