package polyofdm.chart;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.xy.DefaultTableXYDataset;
import org.jfree.data.xy.XYSeries;
import Jama.Matrix;
public class ChartGenerator {
public static JFreeChart createChartReal(Matrix matrix, boolean sin, String titlePart1, String titlePart2)
{
DefaultTableXYDataset dataset = calculateChartDatasetRealraum(matrix, sin);
JFreeChart chart = ChartFactory.createXYLineChart(
titlePart1 + ", time domain " + (sin ? "(sin)":"(cos)") + ", " + titlePart2, // title
"time t", // x-axis label
"amplitude f(t)", // y-axis label
dataset, // data
PlotOrientation.VERTICAL,
true, // create legend?
true, // generate tooltips?
false // generate URLs?
);
return chart;
}
public static JFreeChart createChartMaxAmp(Matrix matrix, String titlePart1, String titlePart2)
{
DefaultTableXYDataset dataset = calculateChartDatasetMaxAmp(matrix);
JFreeChart chart = ChartFactory.createXYLineChart(
titlePart1 + ", time domain (norm), " + titlePart2, // title
"time t", // x-axis label
"amplitude f(t)", // y-axis label
dataset, // data
PlotOrientation.VERTICAL,
true, // create legend?
true, // generate tooltips?
false // generate URLs?
);
return chart;
}
public static JFreeChart createChartSpektrum(Matrix matrix, boolean nah, boolean onlyAll, String titlePart1, String titlePart2)
{
StringBuilder sb = new StringBuilder();
sb.append(titlePart1);
sb.append(", spectrum");
if (onlyAll)
sb.append("-envelope");
if (nah)
sb.append(" (near), ");
else
sb.append(" (far), ");
sb.append(titlePart2);
DefaultTableXYDataset dataSet = calculateChartDatasetSpektrum(matrix, nah, onlyAll);
JFreeChart chart = ChartFactory.createXYLineChart(
sb.toString(), // title
"frequency f (normalized)", // x-axis label
"power spectrum (dB)", // y-axis label
dataSet, // data
PlotOrientation.VERTICAL,
true, // create legend?
true, // generate tooltips?
false // generate URLs?
);
return chart;
}
private static DefaultTableXYDataset calculateChartDatasetSpektrum(
Matrix matrix, boolean nah, boolean onlyAll)
{
int carriers = matrix.getColumnDimension();
double translation = (carriers-1) / 2d;
int stepspertab = 10;
int stepsToOneSide;
double minDezibel;
if (nah){
stepsToOneSide = carriers * stepspertab;
minDezibel = -70;
} else {
stepsToOneSide = carriers * stepspertab *2;
minDezibel = -100;
}
double maxPower = 0;
for (int i = -stepsToOneSide; i < stepsToOneSide; i++) {
double time2 = i / (double)stepspertab;
double time = time2 * StrictMath.PI;
double power = 0;
for (int basisVector = 0; basisVector < matrix.getRowDimension(); basisVector++) {
double sum = 0;
for (int carrier = 0; carrier < carriers; carrier++) {
double ck = matrix.get(basisVector, carrier);
double timesinc = time + (-carrier + translation) * StrictMath.PI;
double sinc = sinc(timesinc);
double value = ck * sinc;
sum += value;
}
power += sum*sum;
}
if (power > maxPower)
maxPower = power;
}
DefaultTableXYDataset xyData = new DefaultTableXYDataset();
if (!onlyAll){
for (int basisVector = 0; basisVector < matrix.getRowDimension(); basisVector++) {
XYSeries xySeries = new XYSeries("Func " + basisVector, true, false);
for (int i = -stepsToOneSide; i < stepsToOneSide; i++) {
double time2 = i / (double)stepspertab;
double time = time2 * StrictMath.PI;
double sum = 0;
for (int carrier = 0; carrier < carriers; carrier++) {
double ck = matrix.get(basisVector, carrier);
double timesinc = time + (-carrier + translation) * StrictMath.PI;
double sinc = sinc(timesinc);
double value = ck * sinc;
sum += value;
}
double power = sum*sum;
xySeries.add(time2, Math.max(minDezibel, 10*Math.log10(power/maxPower)));
}
xyData.addSeries(xySeries);
}
}
XYSeries xySeriesSum = new XYSeries("Sum ", true, false);
for (int i = -stepsToOneSide; i < stepsToOneSide; i++) {
double time2 = i / (double)stepspertab;
double time = time2 * StrictMath.PI;
double power = 0;
for (int basisVector = 0; basisVector < matrix.getRowDimension(); basisVector++) {
double sum = 0;
for (int carrier = 0; carrier < carriers; carrier++) {
double ck = matrix.get(basisVector, carrier);
double timesinc = time + (-carrier + translation) * StrictMath.PI;
double sinc = sinc(timesinc);
double value = ck * sinc;
sum += value;
}
power += sum*sum;
}
xySeriesSum.add(time2, Math.max(minDezibel, 10*Math.log10(power/maxPower)));
}
xyData.addSeries(xySeriesSum);
return xyData;
}
private static DefaultTableXYDataset calculateChartDatasetMaxAmp(Matrix matrix) {
int n = matrix.getColumnDimension();
double translate = (n - 1) / 2d;
int steps = 200;
DefaultTableXYDataset xyData = new DefaultTableXYDataset();
for (int basisVector = 0; basisVector < matrix.getRowDimension(); basisVector++) {
XYSeries xySeries1 = new XYSeries("Ampl. " + basisVector, true, false);
for (int i = -steps; i <= steps; i++)
{
double omega = i * StrictMath.PI / steps;
double sumCos = 0;
double sumSin = 0;
for (int carrier = 0; carrier < n; carrier++) {
double ck = matrix.get(basisVector, carrier);
sumSin += ck * StrictMath.sin((carrier-translate) * omega);
sumCos += ck * StrictMath.cos((carrier-translate) * omega);
}
xySeries1.add(omega, StrictMath.sqrt(sumSin*sumSin+ sumCos*sumCos));
}
xyData.addSeries(xySeries1);
}
return xyData;
}
private static DefaultTableXYDataset calculateChartDatasetRealraum(Matrix matrix, boolean sin) {
int n = matrix.getColumnDimension();
double translate = (n - 1) / 2d;
int steps = 200;
DefaultTableXYDataset xyData = new DefaultTableXYDataset();
for (int basisVector = 0; basisVector < matrix.getRowDimension(); basisVector++) {
XYSeries xySeries1 = new XYSeries("Ampl. " + basisVector, true, false);
for (int i = -steps; i <= steps; i++)
{
double omega = i * StrictMath.PI / steps;
double sum = 0;
for (int carrier = 0; carrier < n; carrier++) {
double ck = matrix.get(basisVector, carrier);
if (sin)
sum += ck * StrictMath.sin((carrier-translate) * omega);
else
sum += ck * StrictMath.cos((carrier-translate) * omega);
}
xySeries1.add(omega, sum);
}
xyData.addSeries(xySeries1);
}
return xyData;
}
public static JFreeChart createChartFourier(Matrix matrix, String titlePart1, String titlePart2)
{
DefaultTableXYDataset dataset = calculateChartDatasetFourierraum(matrix);
JFreeChart chart = ChartFactory.createXYLineChart(
titlePart1 + ", frequency domain, " + titlePart2, // title
"frequency f (normalized)", // x-axis label
"F~", // y-axis label
dataset, // data
PlotOrientation.VERTICAL,
true, // create legend?
true, // generate tooltips?
false // generate URLs?
);
return chart;
}
private static DefaultTableXYDataset calculateChartDatasetFourierraum(
Matrix matrix)
{
int stuetzstellen = matrix.getColumnDimension();
double translate = (stuetzstellen-1) / 2d;
int stepspertab = 10;
int stepsToOneSide = stuetzstellen * stepspertab;
DefaultTableXYDataset xyData = new DefaultTableXYDataset();
for (int basisVector = 0; basisVector < matrix.getRowDimension(); basisVector++) {
XYSeries xySeries = new XYSeries("Func " + basisVector, true, false);
for (int i = -stepsToOneSide; i < stepsToOneSide; i++) {
double time2 = i / (double)stepspertab;
double time = time2 * StrictMath.PI;
double sum = 0;
for (int carrier = 0; carrier < stuetzstellen; carrier++) {
double ck = matrix.get(basisVector, carrier);
double timesinc = time + (-carrier + translate) * StrictMath.PI;
double sinc = sinc(timesinc);
double value = ck * sinc;
sum += value;
}
xySeries.add(time2, sum);
}
xyData.addSeries(xySeries);
}
return xyData;
}
private static double sinc(double time) {
if (time != 0)
return StrictMath.sin(time) / time;
else
return 1;
}
}