আমি "উইন্ডো ফাংশন" এর জন্য শর্টহ্যান্ড উইন্ডোটি ব্যবহার করব ।
অডিও সহ, কোনও প্রক্রিয়াকরণ যা প্রাক-রিং বা প্রাক-প্রতিধ্বনি সদৃশ কিছু তৈরি করে তা কম বিট-রেট এমপি 3 এর মতো স্লশ শোভা পাবে। এটি ঘটে যখন একটি ক্ষণস্থায়ী বা আবেগের স্থানীয়করণের সময়টি পিছনে পিছনে ছড়িয়ে পড়ে, উদাহরণস্বরূপ ল্যাপড ট্রান্সফর্মগুলিতে বর্ণালী ডেটা সংশোধন করে যেমন ল্যাপড মডিফাইড ডিস্ক্রিট কোসাইন ট্রান্সফর্ম (এমডিসিটি)। এই জাতীয় প্রক্রিয়াকরণে অডিও ওভারল্যাপিং বিশ্লেষণ উইন্ডোগুলির দ্বারা উইন্ডোযুক্ত হয় , ট্রান্সফর্ম হয়, ফ্রিকোয়েন্সি ডোমেনে প্রসেস করা হয় (যেমন একটি ছোট বিটরেটে ডেটা সংকোচিত করা হয়), আবার সংশ্লেষণ উইন্ডো দিয়ে আবার উইন্ডোড করা হয় এবং একসাথে ফিরে সংযুক্ত করা হয়। বিশ্লেষণ এবং সংশ্লেষণ উইন্ডোটির পণ্য অবশ্যই এমন হওয়া উচিত যে ওভারল্যাপিং উইন্ডোগুলির একতার মিল রয়েছে।
Ditionতিহ্যগতভাবে ব্যবহৃত উইন্ডো ফাংশনগুলি প্রতিসাম্যযুক্ত ছিল এবং তাদের প্রস্থটি ফ্রিকোয়েন্সি সিলেকটিভিটি (দীর্ঘ উইন্ডো) এবং সময়-ডোমেন আর্টিফ্যাক্ট এড়ানো (সংক্ষিপ্ত উইন্ডো) এর মধ্যে একটি আপস ছিল। উইন্ডোটি যত বেশি প্রশস্ত হবে প্রক্রিয়াকরণটি সংকেতটি ছড়িয়ে দিতে পারে time আরও সাম্প্রতিক সমাধান হ'ল অসম্পূর্ণ উইন্ডোটি ব্যবহার করা। দুটি উইন্ডো একে অপরের মিরর ইমেজ হতে পারে। বিশ্লেষণ উইন্ডোটি শিখর থেকে শূন্যের দিকে দ্রুত নেমে যায় যাতে ইমালসগুলি খুব বেশি আগে থেকেই "সনাক্ত করা যায় না" এবং সংশ্লেষ উইন্ডোটি শূন্য থেকে শীর্ষে দ্রুত গতিতে উঠে যায়, যাতে কোনও প্রক্রিয়াকরণের প্রভাবগুলি সময়ের পিছনে পিছনে ছড়িয়ে না যায়। এর আর একটি সুবিধা হ'ল কম বিলম্ব। অসম্যমিত উইন্ডোতে ভাল ফ্রিকোয়েন্সি-সিলেক্টিভিটি থাকতে পারে এবং এক ধরণের নিরাময়ের মতো অডিও সংকোচনে পরিবর্তনশীল-আকারের প্রতিসাম্য উইন্ডোগুলি প্রতিস্থাপন করতে পারে। দেখাএম। শ্নেল, এম। শ্মিড্ট, এম। জেন্ডার, টি। আলবার্ট, আর জিজার, ভি। রূপপিলা, পি। একস্ট্র্যান্ড, এম। লুটজকি, বি। গ্রিল, "এমপিইজি -4 এনহান্সড লো বিলম্বি এএসি - উচ্চের জন্য একটি নতুন মান মানসম্পন্ন যোগাযোগ " , 125 তম এইএস কনভেনশন, সান ফ্রান্সিসকো, সিএ, মার্কিন যুক্তরাষ্ট্র, প্রিন্ট 7503, অক্টোবর। 2008 এবং অন্য একটি সম্মেলন পত্র যেখানে তারা তাদের উইন্ডোটির ফুরিয়ার রূপান্তরটির তাত্পর্যও দেখায়: শ্নেল, এম, এট আল। 2007. এমপিইজি -4 উন্নত বিলম্ব এএসি - লো বিট্রেট উচ্চমানের যোগাযোগ। 122 তম এইএস কনভেনশনে ।
চিত্র 1. ল্যাপড বিশ্লেষণ-প্রক্রিয়াকরণ-সংশ্লেষণে অসামান্য উইন্ডোগুলির ব্যবহারের চিত্রণ। বিশ্লেষণ উইন্ডো (নীল) এবং সিন্থেসিস উইন্ডো (হলুদ বর্ণের কমলা) এর পণ্য (কালো ড্যাশড) এর পূর্ববর্তী ফ্রেম (ধূসর ড্যাশড) থেকে উইন্ডোটির সাথে একাত্মতার যোগফল। এমডিসিটি ব্যবহার করার সময় নিখুঁত পুনর্গঠনের গ্যারান্টি দেওয়ার জন্য আরও বাধা দরকার।
এমডিসিটির পরিবর্তে ডিস্ক্রিট ফুরিয়ার ট্রান্সফর্ম (ডিএফটি, এফএফটি) ব্যবহার করা যেতে পারে, তবে এই জাতীয় প্রেক্ষাপটে অপ্রয়োজনীয় বর্ণালী ডেটা দেবে। ডিএফটি এর সাথে তুলনা করে, উপযুক্ত উইন্ডোজ বেছে নেওয়া হলে নিখুঁত পুনর্গঠন সক্ষম করার পরেও এমডিসিটি বর্ণালি ডেটার অর্ধেক দেয়।
ডিএফটি ব্যবহার করে ল্যাপড এনালাইসিস-প্রসেসিং-সংশ্লেষণের জন্য উপযুক্ত আমার নিজস্ব অসম্পূর্ণ উইন্ডো ডিজাইন (চিত্র 2) এখানে রয়েছে তবে এটি এমডিসিটি নয় যা এটি নিখুঁত পুনর্গঠন দেয় না। উইন্ডোটি কিছু সম্ভাব্য দরকারী সময়-ডোমেন বৈশিষ্ট্য বজায় রাখার সময় গড়-বর্গক্ষেত্র সময় এবং ফ্রিকোয়েন্সি ব্যান্ডউইথের (একইভাবে সীমাবদ্ধ গাউসিয়ান উইন্ডোর অনুরূপ ) পণ্যকে হ্রাস করার চেষ্টা করে: "টাইম শূন্য" শীর্ষে শিখার সাথে অবিস্মরণীয়, অবিশ্বাস্য যার চারপাশে বিশ্লেষণ এবং সংশ্লেষণ উইন্ডোজ একে অপরের আয়না চিত্র, ফাংশন এবং প্রথম ডেরাইভেটিভ ধারাবাহিকতা, উইন্ডো ফাংশনটির বর্গক্ষেত্রটিকে একটি অস্বাভাবিক সম্ভাবনা ঘনত্ব ফাংশন হিসাবে ব্যাখ্যা করলে শূন্য-গড় হয়। ডিফারেনশিয়াল বিবর্তন ব্যবহার করে উইন্ডোটি অনুকূলিত হয়েছিল ।
চিত্র ২. বাম: ওভারল্যাপযুক্ত বিশ্লেষণ-প্রক্রিয়াকরণ-পুনরায় সংশ্লেষণের জন্য উপযুক্ত সময়যুক্ত বিপরীতমুখী সংশ্লেষ উইন্ডোটির সাথে একত্রে অ্যাসিমেট্রিকাল বিশ্লেষণ উইন্ডো। ডান: অসম্পূর্ণ উইন্ডোর মতো একই বিলম্ব সহ কোসাইন উইন্ডো
চিত্র ৩. কোজাইন উইন্ডো (নীল) এবং চিত্রের অসমমিতিক উইন্ডো (কমলা) এর ফুরিয়ার রূপান্তরের বিশালতা ২. অসমমিতিক উইন্ডো আরও ভাল ফ্রিকোয়েন্সি নির্বাচনকে দেখায়।
প্লটগুলির জন্য এবং অসম্পূর্ণ উইন্ডোর জন্য অক্টাভা উত্স কোড। প্লটিং কোডটি উইকিমিডিয়া কমন্স থেকে আসে । লিনাক্স আমি ইনস্টল করার প্রস্তাব দিই gnuplot
, epstool
, pstoedit
, transfig
প্রথম এবং librsvg2-bin
ব্যবহার দেখছেন display
।
pkg load signal
graphics_toolkit gnuplot
set (0, "defaultaxesfontname", "sans-serif")
set (0, "defaultaxesfontsize", 12)
set (0, "defaultaxeslinewidth", 1)
function plotWindow (w, wname, wfilename = "", wspecifier = "", wfilespecifier = "")
M = 32; % Fourier transform size as multiple of window length
Q = 512; % Number of samples in time domain plot
P = 40; % Maximum bin index drawn
dr = 130; % Maximum attenuation (dB) drawn in frequency domain plot
N = length(w);
B = N*sum(w.^2)/sum(w)^2 % noise bandwidth (bins)
k = [0 : 1/Q : 1];
w2 = interp1 ([0 : 1/(N-1) : 1], w, k);
if (M/N < Q)
Q = M/N;
endif
figure('position', [1 1 1200 600])
subplot(1,2,1)
area(k,w2,'FaceColor', [0 0.4 0.6], 'edgecolor', [0 0 0], 'linewidth', 1)
if (min(w) >= -0.01)
ylim([0 1.05])
set(gca,'YTick', [0 : 0.1 : 1])
else
ylim([-1 5])
set(gca,'YTick', [-1 : 1 : 5])
endif
ylabel('amplitude')
set(gca,'XTick', [0 : 1/8 : 1])
set(gca,'XTickLabel',[' 0'; ' '; ' '; ' '; ' '; ' '; ' '; ' '; 'N-1'])
grid('on')
set(gca,'gridlinestyle','-')
xlabel('samples')
if (strcmp (wspecifier, ""))
title(cstrcat(wname,' window'), 'interpreter', 'none')
else
title(cstrcat(wname,' window (', wspecifier, ')'), 'interpreter', 'none')
endif
set(gca,'Position',[0.094 0.17 0.38 0.71])
H = abs(fft([w zeros(1,(M-1)*N)]));
H = fftshift(H);
H = H/max(H);
H = 20*log10(H);
H = max(-dr,H);
k = ([1:M*N]-1-M*N/2)/M;
k2 = [-P : 1/M : P];
H2 = interp1 (k, H, k2);
subplot(1,2,2)
set(gca,'FontSize',28)
h = stem(k2,H2,'-');
set(h,'BaseValue',-dr)
xlim([-P P])
ylim([-dr 6])
set(gca,'YTick', [0 : -10 : -dr])
set(findobj('Type','line'),'Marker','none','Color',[0.8710 0.49 0])
grid('on')
set(findobj('Type','gridline'),'Color',[.871 .49 0])
set(gca,'gridlinestyle','-')
ylabel('decibels')
xlabel('bins')
title('Fourier transform')
set(gca,'Position',[0.595 0.17 0.385 0.71])
if (strcmp (wfilename, ""))
wfilename = wname;
endif
if (strcmp (wfilespecifier, ""))
wfilespecifier = wspecifier;
endif
if (strcmp (wfilespecifier, ""))
savetoname = cstrcat('Window function and frequency response - ', wfilename, '.svg');
else
savetoname = cstrcat('Window function and frequency response - ', wfilename, ' (', wfilespecifier, ').svg');
endif
print(savetoname, '-dsvg', '-S1200,600')
close
endfunction
N=2^17; % Window length, B is equal for Triangular and Bartlett from 2^17
k=0:N-1;
w = -cos(2*pi*k/(N-1));
w .*= w > 0;
plotWindow(w, "Cosine")
freqData = [0.66697133904805994131, -0.20556692772918355727, 0.49267389481655493588, -0.25062332863369246594, -0.42388422228212319087, 0.42317609537724842905, -0.03930334287740060856, -0.11936153294075849129, 0.30201210285940127687, -0.15541616804857899536, -0.16208119255594669039, 0.12843871362286504723, -0.04470810646117385351, -0.00521885027256757845, 0.07185811583185619522, -0.02835116723496184862, -0.01393644785822748498, 0.00780746224568363342, -0.00748496824751256583, 0.00119325723511989282, 0.00194602547595042175];
freqData(1) /= 2;
scale = freqData(1) + sum(freqData.*not(mod(1:length(freqData), 2)));
freqData /= scale;
w = freqData(1)*ones(1, N);
for bin = 1:(length(freqData)/2)
w += freqData(bin*2)*cos(2*pi*bin*((1:N)-1)/N);
w += freqData(bin*2+1)*sin(2*pi*bin*((1:N)-1)/N);
endfor
w(N/4+1:N/2+1) = 0;
w(N/8+2:N/4) = (1 - w(N/8:-1:2).*w(7*N/8+2:N))./w(7*N/8:-1:6*N/8+2);
w = shift(w, -N/2);
plotWindow(w, "Asymmetrical");
আপনি উইন্ডোর প্রতিটি দ্বিতীয় নমুনা ব্যবহার করতে চাইতে পারেন কারণ এটি শূন্যে শুরু হয় এবং শেষ হয়। নিম্নলিখিত সি ++ কোডটি আপনার জন্য এটি করে তাই আপনি উইন্ডোর এক চতুর্থাংশের বাইরে যে কোনও জায়গায় শূন্য নমুনা পাবেন না। বিশ্লেষণ উইন্ডোটির জন্য এটি প্রথম ত্রৈমাসিক এবং সংশ্লেষণ উইন্ডোটির জন্য এটি শেষ প্রান্তিক। বিশ্লেষণ উইন্ডোর দ্বিতীয়ার্ধটি তাদের পণ্যের গণনার জন্য সংশ্লেষণ উইন্ডোর প্রথমার্ধের সাথে একত্রিত হওয়া উচিত। কোডটি উইন্ডোটির গড় পরীক্ষা করে (সম্ভাব্যতা ঘনত্ব ফাংশন হিসাবে) এবং ওভারল্যাপযুক্ত পুনর্নির্মাণের স্থূলতা প্রদর্শন করে।
#include <stdio.h>
#include <math.h>
int main() {
const int windowSize = 400;
double *analysisWindow = new double[windowSize];
double *synthesisWindow = new double[windowSize];
for (int k = 0; k < windowSize/4; k++) {
analysisWindow[k] = 0;
}
for (int k = windowSize/4; k < windowSize*7/8; k++) {
double x = 2 * M_PI * ((k+0.5)/windowSize - 1.75);
analysisWindow[k] = 2.57392230162633461887-1.58661480271141974718*cos(x)+3.80257516644523141380*sin(x)
-1.93437090055110760822*cos(2*x)-3.27163999159752183488*sin(2*x)+3.26617449847621266201*cos(3*x)
-0.30335261753524439543*sin(3*x)-0.92126091064427817479*cos(4*x)+2.33100177294084742741*sin(4*x)
-1.19953922321306438725*cos(5*x)-1.25098147932225423062*sin(5*x)+0.99132076607048635886*cos(6*x)
-0.34506787787355830410*sin(6*x)-0.04028033685700077582*cos(7*x)+0.55461815542612269425*sin(7*x)
-0.21882110175036428856*cos(8*x)-0.10756484378756643594*sin(8*x)+0.06025986430527170007*cos(9*x)
-0.05777077835678736534*sin(9*x)+0.00920984524892982936*cos(10*x)+0.01501989089735343216*sin(10*x);
}
for (int k = 0; k < windowSize/8; k++) {
analysisWindow[windowSize-1-k] = (1 - analysisWindow[windowSize*3/4-1-k]*analysisWindow[windowSize*3/4+k])/analysisWindow[windowSize/2+k];
}
printf("Analysis window:\n");
for (int k = 0; k < windowSize; k++) {
printf("%d\t%.10f\n", k, analysisWindow[k]);
}
double accu, accu2;
for (int k = 0; k < windowSize; k++) {
accu += k*analysisWindow[k]*analysisWindow[k];
accu2 += analysisWindow[k]*analysisWindow[k];
}
for (int k = 0; k < windowSize; k++) {
synthesisWindow[k] = analysisWindow[windowSize-1-k];
}
printf("\nSynthesis window:\n");
for (int k = 0; k < windowSize; k++) {
printf("%d\t%.10f\n", k, synthesisWindow[k]);
}
printf("Mean of square of analysis window as probability density function:\n%f", accu/accu2);
printf("\nProduct of analysis and synthesis windows:\n");
for (int k = 0; k < windowSize/2; k++) {
printf("%d\t%.10f\n", k, analysisWindow[windowSize/2+k]*synthesisWindow[k]);
}
printf("\nSum of overlapping products of windows:\n");
for (int k = 0; k < windowSize/4; k++) {
printf("%d\t%.10f\n", k, analysisWindow[windowSize/2+k]*synthesisWindow[k]+analysisWindow[windowSize/2+k+windowSize/4]*synthesisWindow[k+windowSize/4]);
}
delete[] analysisWindow;
delete[] synthesisWindow;
}
এবং চুম্বন এফএফটি এবং একটি অপ্টিমাইজেশন লাইব্রেরির সাথে ব্যবহারের জন্য অপ্টিমাইজেশন ব্যয় ফাংশনের সোর্স কোড :
class WinProblem : public Opti::Problem {
private:
int numParams;
double *min;
double *max;
kiss_fft_scalar *timeData;
kiss_fft_cpx *freqData;
int smallSize;
int bigSize;
kiss_fftr_cfg smallFFTR;
kiss_fftr_cfg smallIFFTR;
kiss_fftr_cfg bigFFTR;
kiss_fftr_cfg bigIFFTR;
public:
// numParams must be odd
WinProblem(int numParams, int smallSize, int bigSize, double* candidate = NULL) : numParams(numParams), smallSize(smallSize), bigSize(bigSize) {
min = new double[numParams];
max = new double[numParams];
if (candidate != NULL) {
for (int i = 0; i < numParams; i++) {
min[i] = candidate[i]-fabs(candidate[i])*(1.0/65536);
max[i] = candidate[i]+fabs(candidate[i])*(1.0/65536);
}
} else {
for (int i = 0; i < numParams; i++) {
min[i] = -1;
max[i] = 1;
}
}
timeData = new kiss_fft_scalar[bigSize];
freqData = new kiss_fft_cpx[bigSize/2+1];
smallFFTR = kiss_fftr_alloc(smallSize, 0, NULL, NULL);
smallIFFTR = kiss_fftr_alloc(smallSize, 1, NULL, NULL);
bigFFTR = kiss_fftr_alloc(bigSize, 0, NULL, NULL);
bigIFFTR = kiss_fftr_alloc(bigSize, 1, NULL, NULL);
}
double *getMin() {
return min;
}
double *getMax() {
return max;
}
// ___ __ 1
// | \ | | | | | | | / |
// | \ | | | | | | | / |
// | \_ | | | | | | | / |
// | \|__ | | | | | | /| |
// | | -----|_______|___ | | | | / | |
// | | | | ----| | | |/ | |
// --------------------------------x-----------------------x---|---- 0
// 0 1/8 2/8 3/8 4/8 5/8 6/8 7/8 15/16
// |-------------------------------| |-------|
// zeroStarts winStarts
//
// f(x) = 0 if 4/8 < x < 7/8
// f(-x)f(x) + f(-x+1/8)f(x-1/8) = 1 if 0 < x < 1/8
double costFunction(double *params, double compare, int print) {
double penalty = 0;
double accu = params[0]/2;
for (int i = 1; i < numParams; i += 2) {
accu += params[i];
}
if (print) {
printf("%.20f", params[0]/2/accu);
for (int i = 1; i < numParams; i += 2) {
printf("+%.20fcos(%d pi x)", params[i]/accu, (i+1)/2);
printf("+%.20fsin(%d pi x)", params[i+1]/accu, (i+1)/2);
}
printf("\n");
}
if (accu != 0) {
for (int i = 0; i < numParams; i++) {
params[i] /= accu;
}
}
const int zeroStarts = 4; // Normally 4
const int winStarts = 2; // Normally 1
int i = 0;
int j = 0;
freqData[j].r = params[i++];
freqData[j++].i = 0;
for (; i < numParams;) {
freqData[j].r = params[i++];
freqData[j++].i = params[i++];
}
for (; j <= smallSize/2;) {
freqData[j].r = 0;
freqData[j++].i = 0;
}
kiss_fftri(smallIFFTR, freqData, timeData);
double scale = 1.0/timeData[0];
double tilt = 0;
double tilt2 = 0;
for (int i = 2; i < numParams; i += 2) {
if ((i/2)%2) {
tilt2 += (i/2)*params[i]*scale;
} else {
tilt2 -= (i/2)*params[i]*scale;
}
tilt += (i/2)*params[i]*scale;
}
penalty += fabs(tilt);
penalty += fabs(tilt2);
double accu2 = 0;
for (int i = 0; i < smallSize; i++) {
timeData[i] *= scale;
}
penalty += fabs(timeData[zeroStarts*smallSize/8]);
penalty += fabs(timeData[winStarts*smallSize/16]*timeData[smallSize-winStarts*smallSize/16]-0.5);
for (int i = 1; i < winStarts*smallSize/16; i++) {
// Last 16th
timeData[bigSize-winStarts*smallSize/16+i] = timeData[smallSize-winStarts*smallSize/16+i];
accu2 += timeData[bigSize-winStarts*smallSize/16+i]*timeData[bigSize-winStarts*smallSize/16+i];
}
// f(-1/8+i)*f(1/8-i) + f(i)*f(-i) = 1
// => f(-1/8+i) = (1 - f(i)*f(-i))/f(1/8-i)
// => f(-1/16) = (1 - f(1/16)*f(-1/16))/f(1/16)
// = 1/(2 f(1/16))
for (int i = 1; i < winStarts*smallSize/16; i++) {
// 2nd last 16th
timeData[bigSize-winStarts*smallSize/8+i] = (1 - timeData[i]*timeData[bigSize-i])/timeData[winStarts*smallSize/8-i];
accu2 += timeData[bigSize-winStarts*smallSize/8+i]*timeData[bigSize-winStarts*smallSize/8+i];
}
// Between 2nd last and last 16th
timeData[bigSize-winStarts*smallSize/16] = 1/(2*timeData[winStarts*smallSize/16]);
accu2 += timeData[bigSize-winStarts*smallSize/16]*timeData[bigSize-winStarts*smallSize/16];
for (int i = zeroStarts*smallSize/8; i <= bigSize-winStarts*smallSize/8; i++) {
timeData[i] = 0;
}
for (int i = 0; i < zeroStarts*smallSize/8; i++) {
accu2 += timeData[i]*timeData[i];
}
if (print > 1) {
printf("\n");
for (int x = 0; x < bigSize; x++) {
printf("%d,%f\n", x, timeData[x]);
}
}
scale = 1/sqrt(accu2);
if (print) {
printf("sqrt(accu2) = %f\n", sqrt(accu2));
}
double tSpread = 0;
timeData[0] *= scale;
double tMean = 0;
for (int i = 1; i <= zeroStarts*smallSize/8; i++) {
timeData[i] *= scale;
// tSpread += ((double)i)*((double)i)*(timeData[i]*timeData[i]);
double x_0 = timeData[i-1]*timeData[i-1];
double x_1 = timeData[i]*timeData[i];
tSpread += ((double)i)*((double)i)*(x_0 + x_1)*0.5 - ((double)i)*(2.0/3*x_0 + 1.0/3*x_1) + 0.25*x_0 + 1.0/12*x_1;
double slope = timeData[i]-timeData[i-1];
if (slope > 0) {
penalty += slope+1;
}
tMean += x_1*i;
if (timeData[i] < 0) {
penalty -= timeData[i];
}
}
double x_0 = timeData[0]*timeData[0];
for (int i = 1; i <= winStarts*smallSize/8; i++) {
timeData[bigSize-i] *= scale;
double x_1 = timeData[bigSize-i]*timeData[bigSize-i];
tSpread += ((double)i)*((double)i)*(x_0 + x_1)*0.5 - ((double)i)*(2.0/3*x_0 + 1.0/3*x_1) + 0.25*x_0 + 1.0/12*x_1;
x_0 = x_1;
tMean += x_1*(-i);
}
tMean /= smallSize;
penalty += fabs(tMean);
if (tMean > 0) {
penalty += 1;
}
tSpread /= ((double)smallSize)*((double)smallSize);
if (print) {
printf("tSpread = %f\n", tSpread);
}
kiss_fftr(bigFFTR, timeData, freqData);
double fSpread = 0;
x_0 = freqData[0].r*freqData[0].r;
for (int i = 1; i <= bigSize/2; i++) {
double x_1 = freqData[i].r*freqData[i].r+freqData[i].i*freqData[i].i;
fSpread += ((double)i)*((double)i)*(x_0 + x_1)*0.5 - ((double)i)*(2.0/3*x_0 + 1.0/3*x_1) + 0.25*x_0 + 1.0/12*x_1;
x_0 = x_1;
}
if (print > 1) {
for (int i = 0; i <= bigSize/2; i++) {
printf("%d,%f,%f\n", i, freqData[i].r, freqData[i].i);
}
}
fSpread /= bigSize; // Includes kiss_fft scaling
if (print) {
printf("fSpread = %f\n", fSpread);
printf("%f,%f,%f\n", tSpread, fSpread, tSpread*fSpread);
}
return tSpread*fSpread + penalty;
}
double costFunction(double *params, double compare) {
return costFunction(params, compare, false);
}
int getNumDimensions() {
return numParams;
}
~WinProblem() {
delete[] min;
delete[] max;
delete[] timeData;
delete[] freqData;
KISS_FFT_FREE(smallFFTR);
KISS_FFT_FREE(smallIFFTR);
KISS_FFT_FREE(bigFFTR);
KISS_FFT_FREE(bigIFFTR);
}
};