Вот моя проблема/вопрос: из выходных значений вейвлет-преобразования (комплексный спектр или производная величина, нормализованная величина или мощность) я не получаю никаких выводов об амплитудах входных сигналов. >
Так как же я могу "реконструировать"/вычислить амплитуды входных сигналов по выходным значениям вейвлет-преобразования?
Вот пример: задан сигнал, объединенный двумя синусоидами. Обе синусоидальные волны имеют одинаковую амплитуду (1,25), но разные частоты (35,0 и 75,0).
Комбинированный входной сигнал
Выполнение вейвлет-преобразования с PyWavelets с использованием сложного вейвлета Морле (b = 2,5, cf = 2,0) дает нам разложение/"реконструкцию" двух сигналов в форме масштабограммы с выборками и масштабы (последние также могут быть показаны как частоты). Цвет показывает величину, которая рассчитывается с помощью abs(complex_spectrum). Мощность сигналов также может быть показана с помощью «**2» величины, чего не делается в коде.
Скалеограмма вейвлет-преобразования
В качестве дальнейшего шага выполняется нормализация величины путем деления величины на «sqrt(scales)», чтобы равные амплитуды входных сигналов отображались как равные величины.
Скалеограмма вейвлет-преобразования с нормализованным величина
Максимальные значения величины или нормальной величины составляют 4,72 или 0,62 соответственно, поэтому значения отличаются от амплитуд (1,25) входных сигналов.
Так как же я могу «реконструировать»/вычислить амплитуды входных сигналов по выходным значениям (комплексный спектр, величина, мощность) вейвлет-преобразования?
Я предполагаю, что должно быть «масштабирование», основанное на переменных используемого вейвлета, потому что изменение центральной частоты или полосы пропускания морлета-вейвлета изменяет выходные значения преобразования. >
Вот код:
import numpy as np
import matplotlib.pyplot as plt
import pywt
samples = 1000
dt = 1.0 / 1000
ampl1 = 1.25
freq1 = 35.0
ampl2 = 1.25
freq2 = 75.0
x: np.ndarray = np.arange(0, samples) * dt
signal = ampl1 * np.sin(2 * np.pi * freq1 * x) + ampl2 * np.sin(2 * np.pi * freq2 * x)
plt.plot(x, signal)
plt.show()
scales = np.arange(1, 100)
complex_sp, frequencies = pywt.cwt(signal, scales, "cmor2.5-2.0", dt)
magnitude = abs(complex_sp)
plt.imshow(magnitude, cmap="hot", aspect="auto")
plt.colorbar(label="Magnitude")
plt.xlabel("Samples")
plt.ylabel("Scales")
plt.show()
sqrt_scales = np.sqrt(scales)
norm_magnitude = np.divide(magnitude, sqrt_scales[:,None])
plt.imshow(norm_magnitude, cmap="hot", aspect="auto")
plt.colorbar(label="normalized Magnitude")
plt.xlabel("Samples")
plt.ylabel("Scales")
plt.show()
print(np.max(magnitude))
print(np.max(norm_magnitude))
Подробнее здесь: https://stackoverflow.com/questions/793 ... -amplitude
PyWavelet: преобразовать величину в амплитуду? ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение