mirror of
https://github.com/esiur/esiur-dotnet.git
synced 2025-05-06 19:42:58 +00:00
69 lines
2.1 KiB
C#
69 lines
2.1 KiB
C#
using Esiur.Analysis.Statistics;
|
|
using Esiur.Analysis.Units;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Runtime.CompilerServices;
|
|
using System.Security.Cryptography.X509Certificates;
|
|
using System.Text;
|
|
|
|
namespace Esiur.Analysis.Signals
|
|
{
|
|
public static class Capacity
|
|
{
|
|
public struct CSI
|
|
{
|
|
public double SNR;
|
|
public Probability Probability;
|
|
|
|
public CSI(double snr, double probability)
|
|
{
|
|
SNR = snr;
|
|
Probability = probability;
|
|
}
|
|
}
|
|
|
|
public struct OutageCapacity
|
|
{
|
|
public BitRate Capacity;
|
|
public double MinSNR;
|
|
public Probability Outage;
|
|
public double Bandwidth;
|
|
|
|
public OutageCapacity(Probability outage, double minSNR, double bandwidth)
|
|
{
|
|
MinSNR = minSNR;
|
|
Outage = outage;
|
|
Bandwidth = bandwidth;
|
|
Capacity = (1 - Outage) * bandwidth * Math.Log(1 + minSNR, 2);
|
|
}
|
|
|
|
public override string ToString() => $" {MinSNR.ToString("F")} <{Outage}> => {Capacity}";
|
|
}
|
|
|
|
public static double Compute(double bandwidth, double snr)
|
|
=> bandwidth * Math.Log(1 + snr, 2);
|
|
|
|
|
|
public static double ComputeErgodic(double bandwidth, CSI[] receiverCSI)
|
|
{
|
|
return bandwidth * receiverCSI.Sum(x => Math.Log(1 + x.SNR, 2) * x.Probability);
|
|
}
|
|
|
|
public static OutageCapacity[] ComputeOutage(double bandwidth, CSI[] receiverCSI)
|
|
{
|
|
var sorted = receiverCSI.OrderBy(x => x.SNR);
|
|
var rt = sorted.Select(x => {
|
|
var pOut = receiverCSI.Where(csi => csi.SNR < x.SNR).Sum(x => x.Probability);
|
|
return new OutageCapacity()
|
|
{
|
|
Outage = pOut,
|
|
MinSNR = x.SNR,
|
|
Capacity = (1 - pOut) * bandwidth * Math.Log(1 + x.SNR, 2)
|
|
};
|
|
});
|
|
|
|
return rt.ToArray();
|
|
}
|
|
}
|
|
} |