18 #include <QHBoxLayout> 21 #include <QPainterPath> 25 #include "data/fft/FFTapi.h" 35 m_windowType(WindowType(999))
37 QHBoxLayout *layout =
new QHBoxLayout;
55 int w = step * 4, h = 64;
57 Window<float> windower = Window<float>(type, step * 2);
59 QPixmap timeLabel(w, h + 1);
60 timeLabel.fill(Qt::white);
61 QPainter timePainter(&timeLabel);
65 path.moveTo(0, h - peak + 1);
66 path.lineTo(w, h - peak + 1);
68 timePainter.setPen(Qt::gray);
69 timePainter.setRenderHint(QPainter::Antialiasing,
true);
70 timePainter.drawPath(path);
72 path = QPainterPath();
77 float *acc = (
float *)alloca(w *
sizeof(
float));
80 for (
int i = 0; i < w; ++i) acc[i] = 0.f;
81 for (
int j = 0; j < 3; ++j) {
82 for (
int i = 0; i < step * 2; ++i) {
83 acc[j * step + i] += windower.getValue(i);
86 for (
int i = 0; i < w; ++i) {
87 int y = h - int(peak * acc[i] + 0.001) + 1;
88 if (i == 0) path.moveTo(i, y);
89 else path.lineTo(i, y);
92 timePainter.drawPath(path);
93 timePainter.setRenderHint(QPainter::Antialiasing,
false);
95 path = QPainterPath();
97 timePainter.setPen(Qt::black);
99 for (
int i = 0; i < step * 2; ++i) {
100 int y = h - int(peak * windower.getValue(i) + 0.001) + 1;
101 if (i == 0) path.moveTo(i + step,
float(y));
102 else path.lineTo(i + step,
float(y));
105 if (type == RectangularWindow) {
106 timePainter.drawPath(path);
107 path = QPainterPath();
110 timePainter.setRenderHint(QPainter::Antialiasing,
true);
111 path.addRect(0, 0, w, h + 1);
112 timePainter.drawPath(path);
115 font.setPixelSize(10);
116 font.setItalic(
true);
117 timePainter.setFont(font);
118 QString label = tr(
"V / time");
119 timePainter.drawText(w - timePainter.fontMetrics().width(label) - 4,
120 timePainter.fontMetrics().ascent() + 1, label);
126 QPixmap freqLabel(fw, h + 1);
127 freqLabel.fill(Qt::white);
128 QPainter freqPainter(&freqLabel);
129 path = QPainterPath();
133 float *input = (
float *)fftf_malloc(fftsize *
sizeof(
float));
134 fftf_complex *output =
135 (fftf_complex *)fftf_malloc(fftsize *
sizeof(fftf_complex));
136 fftf_plan plan = fftf_plan_dft_r2c_1d(fftsize, input, output,
138 for (
int i = 0; i < fftsize; ++i) input[i] = 0.f;
139 for (
int i = 0; i < step * 2; ++i) {
140 input[fftsize/2 - step + i] = windower.getValue(i);
144 fftf_destroy_plan(plan);
149 for (
int i = 0; i < fftsize/2; ++i) {
150 float power = output[i][0] * output[i][0] + output[i][1] * output[i][1];
153 db = 20 * log10(power);
154 if (first || db > maxdb) maxdb = db;
155 if (first || db < mindb) mindb = db;
160 if (mindb > -80.f) mindb = -80.f;
166 float maxval = maxdb + -mindb;
170 path.moveTo(0, h - peak + 1);
171 path.lineTo(fw, h - peak + 1);
173 freqPainter.setPen(Qt::gray);
174 freqPainter.setRenderHint(QPainter::Antialiasing,
true);
175 freqPainter.drawPath(path);
177 path = QPainterPath();
178 freqPainter.setPen(Qt::black);
182 for (
int i = 0; i < fftsize/2; ++i) {
183 float power = output[i][0] * output[i][0] + output[i][1] * output[i][1];
184 float db = 20 * log10(power);
185 float val = db + -mindb;
186 if (val < 0) val = 0;
187 float norm = val / maxval;
188 float x = (fw / float(fftsize/2)) * i;
189 float y = h - norm * peak + 1;
190 if (i == 0) path.moveTo(x, y);
191 else path.lineTo(x, y);
194 freqPainter.setRenderHint(QPainter::Antialiasing,
true);
195 path.addRect(0, 0, fw, h + 1);
196 freqPainter.drawPath(path);
201 freqPainter.setFont(font);
202 label = tr(
"dB / freq");
203 freqPainter.drawText(fw - freqPainter.fontMetrics().width(label) - 4,
204 freqPainter.fontMetrics().ascent() + 1, label);
WindowShapePreview(QWidget *parent=0)
QLabel * m_windowTimeExampleLabel
virtual ~WindowShapePreview()
void setWindowType(WindowType type)
QLabel * m_windowFreqExampleLabel