2
0
mirror of https://github.com/esiur/esiur-dotnet.git synced 2025-05-06 19:42:58 +00:00
2022-10-16 22:16:00 +03:00

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();
}
}
}