Код: Выделить всё
import random
import numpy as np
import os
import matplotlib.pyplot as plt
# Noise Power in dB
no_dB= 20
noise_power=10**( (no_dB-30)/10 )
# Range of signal power
start, end, Monte_carlo = -40, 20, 10**3
po_dB = np.arange(start, end+1, 5)
power = 10.0 ** ((po_dB) / 10.0)
NMSE = []
for p in power:
nmse = 0
for S in range(0, Monte_carlo):
# Y= Hx + N (Estimating The channel response)
# Channel power
H = (np.random.normal(0, np.sqrt(1/2), 4) + 1j*np.random.normal(0, np.sqrt(1/2), 4))
# Receiver NOISE power AWGN
N = np.sqrt(noise_power/2) * (np.random.randn(1, 4) + 1j * np.random.randn(1, 4))
# Known Signal
xp= np.sqrt(p/2)*(np.random.randn() + 1j * np.random.randn())
Xp = np.kron(np.eye(4),xp)
X_p_dag = np.linalg.pinv(Xp)
Y = H@Xp + N
# Estimate
H_hat=Y@X_p_dag
# Error
err=N@X_p_dag
nmse = nmse + np.linalg.norm(err, 2)**2/np.linalg.norm(H_hat, 2)**2
NMSE.append((nmse / Monte_carlo))
print(10*np.log10(p))
plt.plot(po_dB, NMSE, linewidth='2.5', color='green')# Simulation_cas
plt.xlabel('Signal Power')
plt.ylabel('NMSE')
plt.grid()
plt.yscale("log")
plt.xlim([-20, 20])
plt.ylim([10 ** -4, 10 ** 0])
plt.legend(['NMSE'])
plt.show()
Код: Выделить всё
nmse = nmse + np.linalg.norm(err, 2)**2/np.linalg.norm(H_hat, 2)**2
Насколько мне известно, формула NMSE утверждает, что знаменатель должен быть квадрат нормы истинного канала, но при помещении истинного канала (np.linalg.norm(H, 2)**2) в знаменатель, результаты NMSE больше единицы
Почему это происходит, учитывая, что Формула NMSE указывает истинный канал в знаменателе? есть ли какие-либо условия для этого правила и правильно ли я сделал, используя оценку?
Подробнее здесь: https://stackoverflow.com/questions/793 ... enominator