python - 显示某些函数频谱的正确图像时出错

问题描述 投票:0回答:1

我有一个 Python 代码,可以为五个不同的函数生成图像及其光谱,但存在一个问题,即函数 2 到 5 为光谱生成黑色图像,而不是所需的输出。

问题:

RuntimeWarning: divide by zero encountered in log10
  magnitude_spectrum_2 = 20 * np.log10(np.abs(dft_signal_2))

signal_3-5 相同。

import numpy as np
import matplotlib.pyplot as plt

# Dimensiunile imaginii
M, N = 256, 256

# Generare coordonate n1, n2
n1 = np.arange(0, M)
n2 = np.arange(0, N)
n1, n2 = np.meshgrid(n1, n2)

# Definirea celor cinci funcții date
def signal_function_1(n1, n2):
    return np.sin(2 * np.pi * n1 + 3 * np.pi * n2)

def signal_function_2(n1, n2):
    return np.sin(4 * np.pi * n1) + np.cos(6 * np.pi * n2)

def signal_function_3(n1, n2):
    Y = np.zeros_like(n1, dtype=complex)
    Y[0, 5] = Y[0, N-5] = 1
    return np.real(np.fft.ifft2(Y))

def signal_function_4(n1, n2):
    Y = np.zeros_like(n1, dtype=complex)
    Y[5, 0] = Y[N-5, 0] = 1
    return np.real(np.fft.ifft2(Y))

def signal_function_5(n1, n2):
    Y = np.zeros_like(n1, dtype=complex)
    Y[5, 5] = Y[N-5, N-5] = 1
    return np.real(np.fft.ifft2(Y))

# Calculul semnalelor
signal_1 = signal_function_1(n1, n2)
signal_2 = signal_function_2(n1, n2)
signal_3 = signal_function_3(n1, n2)
signal_4 = signal_function_4(n1, n2)
signal_5 = signal_function_5(n1, n2)

# Calculul DFT bidimensional
dft_signal_1 = np.fft.fft2(signal_1)
dft_signal_2 = np.fft.fft2(signal_2)
dft_signal_3 = np.fft.fft2(signal_3)
dft_signal_4 = np.fft.fft2(signal_4)
dft_signal_5 = np.fft.fft2(signal_5)


magnitude_spectrum_1 = 20 * np.log10(np.abs(dft_signal_1))
magnitude_spectrum_2 = 20 * np.log10(np.abs(dft_signal_2))
magnitude_spectrum_3 = 20 * np.log10(np.abs(dft_signal_3))
magnitude_spectrum_4 = 20 * np.log10(np.abs(dft_signal_4))
magnitude_spectrum_5 = 20 * np.log10(np.abs(dft_signal_5))


# Vizualizare pentru prima funcție
plt.figure(figsize=(12, 8))

plt.subplot(221), plt.imshow(signal_1, cmap='gray'), plt.title('Imagine 1')
plt.subplot(222), plt.imshow(magnitude_spectrum_1), plt.title('Spectru 1')

# Vizualizare pentru a doua funcție
plt.subplot(223), plt.imshow(signal_2, cmap='gray'), plt.title('Imagine 2')
plt.subplot(224), plt.imshow(magnitude_spectrum_2), plt.title('Spectru 2')

plt.show()

plt.figure(figsize=(12, 8))
# Vizualizare pentru a treia funcție
plt.subplot(221), plt.imshow(signal_3, cmap='gray'), plt.title('Imagine 3')
plt.subplot(222), plt.imshow(magnitude_spectrum_3), plt.title('Spectru 3')

plt.show()

# Vizualizare pentru a patra funcție
plt.figure(figsize=(12, 8))

plt.subplot(221), plt.imshow(signal_4, cmap='gray'), plt.title('Imagine 4')
plt.subplot(222), plt.imshow(magnitude_spectrum_4), plt.title('Spectru 4')

# Vizualizare pentru a cincea funcție
plt.subplot(223), plt.imshow(signal_5, cmap='gray'), plt.title('Imagine 5')
plt.subplot(224), plt.imshow(magnitude_spectrum_5), plt.title('Spectru 5')

plt.show()


我尝试解决这个问题,但没有成功。

python signal-processing
1个回答
0
投票

为了避免被零除的错误,可以只计算非零样本的对数:

magnitude_spectrum_1 = 20 * np.log10(np.abs(dft_signal_1), where=dft_signal_1 > 0)
magnitude_spectrum_2 = 20 * np.log10(np.abs(dft_signal_2), where=dft_signal_2 > 0)
magnitude_spectrum_3 = 20 * np.log10(np.abs(dft_signal_3), where=dft_signal_3 > 0)
magnitude_spectrum_4 = 20 * np.log10(np.abs(dft_signal_4), where=dft_signal_4 > 0)
magnitude_spectrum_5 = 20 * np.log10(np.abs(dft_signal_5), where=dft_signal_5 > 0)
© www.soinside.com 2019 - 2024. All rights reserved.