Проблема, с которой я сталкиваюсь, заключается в том, что я увеличиваю масштаб шума Перлина (что увеличивает разрешение /detail значений от 0 до 1) оценка спектра мощности становится меньше по разрешению, независимо от размера периодограмм с использованием метода оценки спектра мощности Бартлетта.
Примеры того, как масштаб влияет на Шум Перлина (разрешение здесь 100, чтобы эффект был заметнее; я тоже пока не могу вставить, извините):
Масштаб 2, Масштаб 8, Масштаб 32Примеры того, как «сжимается» оценка спектра мощности:
Шкала 2 – Разрешение 800 – Количество периодограмм 16,
Масштаб 8 - Разрешение 3200 - Количество Периодограмм 16,
Масштаб 32 - Разрешение 12800 - Количество Периодограмм 16
Что мне не совсем понятно Вот почему оценка спектра мощности становится меньше по мере увеличения масштаба шума, хотя разрешение шума и отдельных периодограмм увеличивается с увеличением масштаба (я думаю, что это как-то связано с fft2d, но я вообще не понимаю, почему ). (Кроме того, чтобы уточнить, я буду использовать гораздо более высокое разрешение и желательно шкалу 32 при расчете фактической оценки спектра мощности)
Ниже приведен код моей реализации метода Бартлетта для 2D-спектры мощности в Python:
Код: Выделить всё
import numpy as np
def compute_periodogram(noise):
fft_result = np.fft.fft2(noise)
fft_shifted = np.fft.fftshift(fft_result)
power_spectrum = np.abs(fft_shifted)**2
return power_spectrum
Код: Выделить всё
# Computes Bartlett's power spectrum estimation for a 2D signal (assumes the 2D signal is a square)
def bartlett_2d(signal, k):
periodograms = []
k_1d = int(np.sqrt(k)) # Makes k (the number of subsections) 1D
m = int(len(signal)/k) # Length of each subsection of the signal
# Divides the signal into subsections and computes a peridogram for each subsection
for y in range(k_1d):
for x in range(k_1d):
# `slice_2d` returns a slice of a 2d array (matrix, x_slice[start, end], y_slice[start, end])
subsection = slice_2d(signal, (m*x, m*(x+1)-1), (m*y, m*(y+1)-1))
periodograms.append(compute_periodogram(subsection))
# Averages peridograms
power_spectrum = np.zeros((m, m))
for pdg in periodograms:
power_spectrum += pdg
return power_spectrum / k
Подробнее здесь: https://stackoverflow.com/questions/791 ... ural-noise