Как создать двумерные оценки спектра мощности с высоким разрешением для процедурного шума?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как создать двумерные оценки спектра мощности с высоким разрешением для процедурного шума?

Сообщение Anonymous »

В настоящее время я пытаюсь получить двумерную оценку спектра мощности для шума Перлина. Пример этого можно найти на странице 15 книги Survey Procedural Noise. Изображения в строке (4) — это то, что я пытаюсь воссоздать; в частности, изображение самой левой строки (4), которое представляет собой оценку спектра мощности шума Перлина.
Проблема, с которой я сталкиваюсь, заключается в том, что я увеличиваю масштаб шума Перлина (что увеличивает разрешение /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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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