অসম্পূর্ণ উইন্ডোংয়ের সাথে এফএফটি?


17

প্রচলিত অ-আয়তক্ষেত্রাকার উইন্ডো ফাংশনগুলি সমস্তটি প্রতিসম বলে মনে হয়। এফএফটি-এর আগে যখন কেউ একটি অ-প্রতিসাম্য উইন্ডো ফাংশনটি ব্যবহার করতে চান এমন কোনও ক্ষেত্রে আছে? (বলুন যদি এফএফটি অ্যাপারচারের একদিকে থাকা ডেটাগুলি অন্যের উপাত্তের তুলনায় কিছুটা বেশি গুরুত্বপূর্ণ বিবেচিত হত, বা কম শব্দ করা ইত্যাদি))

যদি তা হয় তবে কী ধরণের অসমমিতিক উইন্ডো ফাংশনগুলি অধ্যয়ন করা হয়েছে এবং কীভাবে তারা (আরও ক্ষয়?) অফসেট প্রতিসাম্য উইন্ডোর তুলনায় ফ্রিকোয়েন্সি প্রতিক্রিয়াটিকে প্রভাবিত করবে?


2
সাধারণত উইন্ডোগুলি ব্যবহৃত হয় কারণ এফএফটি একটি সিগন্যালের ছোট অংশগুলিতে কাজ করে, এটি স্থানীয়ভাবে স্থানীয় সিগন্যালের মতো দেখানোর চেষ্টা করে। সুতরাং পছন্দ করার মতো কোনও "পক্ষ" নেই, সিগন্যালটি পুরো অভিন্ন বলে ধরে নেওয়া হয়।
এন্ডোলিথ

4
একটি অডিও বিশ্লেষণ অ্যালগরিদম যা লাইভ ডেটাতে কাজ করে এবং যার বিষয়ে চিন্তা করতে থ্রুপুট বিলম্ব হয়, কখনও কখনও একটি অসমমিতিক উইন্ডোটি এমন ডিজাইন করা যেতে পারে যা একই দৈর্ঘ্যের প্রতিসাম্য উইন্ডোর তুলনায় কম কার্যকর বিলম্ব করে। যদি এই অসম্পূর্ণ উইন্ডোর আচরণ (যা আগে থেকেই জানা যায়) এই অডিও বিশ্লেষণের আউটপুট প্যারামিটারগুলিকে একটি পরিচিত পদ্ধতিতে প্রভাবিত করে, তবে সেই পরামিতিগুলি ক্ষতিপূরণ পেতে পারে এবং আপনি হ্রাস বিলম্বের সুবিধা ধরে রাখতে পারেন।
রবার্ট ব্রিস্টো-জনসন

উত্তর:


9

আমি "উইন্ডো ফাংশন" এর জন্য শর্টহ্যান্ড উইন্ডোটি ব্যবহার করব ।

অডিও সহ, কোনও প্রক্রিয়াকরণ যা প্রাক-রিং বা প্রাক-প্রতিধ্বনি সদৃশ কিছু তৈরি করে তা কম বিট-রেট এমপি 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);
  }
};

3

এটি উইন্ডোটিংয়ের প্রসঙ্গে নির্ভর করে। উইন্ডোয়িং, যেমনটি প্রথাগতভাবে বিকশিত হয়েছিল, অনুমানের পাওয়ার বর্ণালী ঘনত্বের ব্ল্যাকম্যান-টুকি পদ্ধতির জন্য উদ্দিষ্ট। এটি সঠিক সংশোধন পদ্ধতিগুলির সাধারণ ফর্ম, যার মাধ্যমে পৃথক-সময়ের উইনার-খিনচিন উপপাদ্যকে কাজে লাগানো হয়। প্রত্যাহার করুন এটি স্বতন্ত্র সময়ের ক্রিয়াকলাপটি ফুরিয়ার রূপান্তর মাধ্যমে পাওয়ার বর্ণাল ঘনত্বের সাথে সম্পর্কিত করে।

অতএব, উইন্ডোজ বেশ কয়েকটি মানদণ্ড মাথায় রেখে নকশা করা হয়েছিল। প্রথমত, তাদের মূলতে unityক্য অর্জন করতে হয়েছিল। এটি সিগন্যালের অটোকোররিলেশন সিকোয়েন্সে শক্তি সংরক্ষণ করা ছিল, কারণ আরএক্সএক্স [0] নমুনা শক্তি হিসাবে ভাবা যেতে পারে। এরপরে, উইন্ডোটি উত্স থেকে টেপা উচিত। এই কারনে একটি নম্বর জন্য। প্রথমত, একটি বৈধ স্বতঃসংশ্লিষ্ট সিকোয়েন্স হওয়ার জন্য, অন্যান্য সমস্ত ল্যাগ অবশ্যই মূলের থেকে কম বা সমান হতে হবে। দ্বিতীয়ত, এটি নিম্ন স্তরের উচ্চতর ওজনকে মঞ্জুরি দেয়, যা বেশিরভাগ নমুনা ব্যবহার করে প্রচুর আত্মবিশ্বাসের সাথে গণনা করা হয়েছে এবং উচ্চতর ল্যাগগুলির ছোট বা শূন্য ওজন, যা তাদের জন্য উপলব্ধ ডেটা নমুনার পরিমাণের হ্রাসের পরিমাণের কারণে বাড়ছে বৈচিত্র্য হিসাব। এটি চূড়ান্তভাবে একটি বৃহত্তর প্রধান লব এবং পরবর্তীকালে পিএসডি অনুমানে রেজোলিউশন হ্রাস করার ফলাফল দেয়,

অবশেষে, উইন্ডোগুলির যদি একটি নননেজিটিভ বর্ণালী থাকে তবে এটি অত্যন্ত পছন্দসই। এটি কারণ ব্ল্যাকম্যান-টুকি পদ্ধতিটি ব্যবহার করে আপনি চূড়ান্ত অনুমানের পক্ষপাতিত্বের কথা ভাবতে পারেন কারণ উইন্ডো বর্ণালীতে সত্যিকারের পাওয়ার বর্ণালী ঘনত্বটি মিলিত হয়েছে। যদি এই উইন্ডো বর্ণালীতে নেতিবাচক অঞ্চল থাকে তবে আপনার পাওয়ার বর্ণাল ঘনত্বের প্রাক্কলনটিতে নেতিবাচক অঞ্চলগুলি থাকা সম্ভব। এটি স্পষ্টতই অনাকাঙ্ক্ষিত, কারণ এই প্রসঙ্গে এর দৈহিক অর্থ খুব কম। এছাড়াও, আপনি লক্ষ্য করবেন যে ব্ল্যাকম্যান-টুকি পদ্ধতিতে কোনও প্রকারের স্কোয়ার অপারেশন নেই। এটি কারণ, একটি বাস্তব এবং এমনকি উইন্ডো দ্বারা গুণিত একটি বাস্তব এবং এমনকি স্বতঃসংশ্লিষ্ট সিকোয়েন্সের সাথে, পৃথক ফুরিয়ার রূপান্তরটি বাস্তব এবং সমানও হবে। অনুশীলনে, আপনি খুব ছোট নেতিবাচক উপাদানগুলি খুঁজে পাবেন যা সাধারণত কোয়ান্টাইটিসড থাকে।

এই কারণগুলির জন্য, উইন্ডোজগুলিও অদ্ভুত দৈর্ঘ্যের কারণ সমস্ত বৈধ স্বতঃসংশোধন ক্রমগুলিও একই সাথে। এখন, যা এখনও করা যায় (এবং এটি করা হয়) প্যারিয়ড্রাম পদ্ধতির প্রসঙ্গে উইন্ডোয়িং করছে। এটি হ'ল ডেটাটি উইন্ডো করুন এবং তারপরে উইন্ডোড ডেটাটির দৈর্ঘ্য স্কোয়ার করুন। এটি ব্ল্যাকম্যান-টুকি পদ্ধতির সমতুল্য নয়। আপনি কিছু পরিসংখ্যানগত derivations মাধ্যমে জানতে পারেন, যে তারা একই রকম ব্যবহার গড়ে সাধারণভাবে, কিন্তু না। উদাহরণস্বরূপ, অনুমানের বৈচিত্র হ্রাস করতে ওয়েলচ বা বার্টলেট পদ্ধতিতে প্রতিটি বিভাগের জন্য উইন্ডোজ ব্যবহার করা বেশ সাধারণ। সুতরাং সংক্ষেপে, এই পদ্ধতিগুলির সাথে, অনুপ্রেরণা অংশে একই, তবে ভিন্ন। এই পদ্ধতিগুলিতে পাওয়ারটি সাধারণভাবে উইন্ডো শক্তি ভাগ করে নেওয়ার পরিবর্তে উইন্ডো ল্যাগের সতর্কতার সাথে ওজন করা যায়।

সুতরাং, আশা করি এটি উইন্ডোজ এবং তাদের উত্সকে এবং কেন সেগুলি প্রতিসাম্যিক context কেন আপনি যদি আগ্রহী হন যে কেন কেউ একটি অসম্পৃক্ত উইন্ডো বেছে নিতে পারে, তবে ফুরিয়ার ট্রান্সফর্মের দ্বৈত সম্পত্তিটির প্রভাবগুলি এবং আপনার পাওয়ার বর্ণালী ঘনত্বের প্রাক্কলনটি কী কী আপনার অ্যাপ্লিকেশনের জন্য বোঝায় তা বিবেচনা করুন। চিয়ার্স।


1

উইন্ডোটিংয়ের মূল বিষয়টি নিশ্চিত করা হয় যে (ডিএফটি দ্বারা অনুমিত পর্যায়ক্রমিক) সিগন্যালের শেষের তুলনায় শুরুতে কোনও তীক্ষ্ণ স্থানান্তর নেই। ব্যয়টি হ'ল (প্রতিসাম্য) উইন্ডোর কেন্দ্রের দিকে ফ্রিকোয়েন্সিগুলি আরও ওজনযুক্ত এবং পরবর্তী ডিএফটিতে উপস্থাপিত হবে।

ব্যাকগ্রাউন্ডে থাকা সমস্ত কিছুর সাথে, আমি কল্পনা করতে পারি যে ডিএফটি-র মাধ্যমে বিশ্লেষণ করা হচ্ছে এমন সিগন্যালে স্থানীয় টেম্পোরাল বৈশিষ্ট্যগুলিকে উচ্চারণ করার জন্য কেউ একটি অসামান্য উইন্ডো ব্যবহার করতে চান । তবে এটি ডিএফটি চলাকালীন আরও বৃহত্তর লব প্রস্থের দামে আসতে পারে, যদি আপনার সিগন্যালের শেষ পয়েন্টগুলি উইন্ডোংয়ের পরে মোটামুটি একই প্রশস্ততা না থাকে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.