Алгоритм дискретизации гетерогенного частотного диапазонаPython

Программы на Python
Anonymous
Алгоритм дискретизации гетерогенного частотного диапазона

Сообщение Anonymous »

Предположим, я моделирую колоколообразный спектр условного сигнала. У меня уже есть граничные значения диапазона частот (начало и конец) и я знаю частоту максимума спектра. При моделировании спектра я не хочу разрешать его равномерно по всему диапазону. Это связано с тем, что есть области, где энергетический вклад очень мал, и, естественно, спектр будет наиболее информативным вблизи максимума.
Вот код моей попытки решить эту проблему:

Код: Выделить всё

import numpy as np
import matplotlib.pyplot as plt

## key values of the frequency range (in Hz)
f_start = 0.016
f_end = 1.25
f_max = 0.16

## Frequency range (in Hz)
delta = 0.03
f_max_start = f_max - delta # the beginning of the spectrum maximum zone
f_max_end = f_max + 2*delta # the end of the spectrum maximum zone

f_band1 = f_max_start - f_start # frequency band up to the maximum range of the spectrum
f_band2 = f_max_end - f_max_start # the frequency band of the spectrum maximum zone
f_band3 = f_end - f_max_end # frequency band after the maximum range of the spectrum

N = np.array([35, 5, 10]) # number of values before the zone/in the zone/after the maximum spectrum zone

df_small = f_band2 / N[0] # a small step near the maximum of the spectrum
df_large1 = f_band1 / N[1] # large step in the rest of the spectrum (up to the maximum zone)
df_large2 = f_band3 / N[2] # large step in the rest of the spectrum (after the maximum zone)

f = [] # initiating the frequency range

# Frequency range values up to the spectrum maximum zone (from f_start to f_max_start)
f_before_peak = np.arange(f_start, f_max_start + df_large1, df_large1)
f.extend(f_before_peak)

# Frequency range values near the spectrum maximum (from fmax_start to f_max_end)
f_around_peak = np.arange(f_max_start + df_small, f_max_end + df_small, df_small)
f.extend(f_around_peak)

# Frequency range values after the spectrum maximum zone (from f_max_end to f_end)
f_after_peak = np.arange(f_max_end + df_large2, f_end + df_large2, df_large2)
f.extend(f_after_peak)

# Calculation of variable steps for subsequent use of the frequency range
f = np.array(f)
df = np.diff(f)

## Output of results
print('Frequency range (in Hz):')
print(f) # frequency range (in Hz)
print('Frequency step (in Hz):')
print(df) # frequency step (in Hz)

sl = np.ones_like(f) # straight horizontal line - visualization of the range
## Plot №1
plt.figure(figsize=(10, 4))
plt.plot(f, sl, 'b-o', markersize=4, linewidth=1.5)
plt.xlabel('Frequency (Hz)')
plt.title('Frequency Range Points')
plt.grid(True, alpha=0.5)
plt.show()
## Plot №2
plt.figure(figsize=(10, 4))
plt.plot(f, sl, 'b-o', markersize=4, linewidth=1.5)
plt.xlabel('Frequency (Hz)')
plt.title('Frequency Range Points')
plt.grid(True, alpha=0.5)
plt.xlim(0, 0.4)
plt.show()
Приведены графики результатов (красные точки — это начальная и конечная точки диапазона и максимум спектра):
Изображение
Изображение

Как видите, код не очень удобен для пользователя. Вам необходимо ввести множество дополнительных параметров и векторов значений. Хотелось бы сделать его более лаконичным, без большого количества дополнительных входных параметров и более удобным для пользователя. Возможно, существует алгоритм (например, математическое выражение) [в Python или MATLAB], который может выполнить аналогичную задачу?

Вернуться в «Python»