예제 #1
0
        /// <summary>
        /// دریافت فرکانسهای داده نمونه
        /// </summary>
        /// <param name="sampleData">داده های نمونه</param>
        /// <param name="bin1024Callback">تابعی که داده های اسپکتروم 1024 تایی دریافت میکند</param>
        /// <param name="bin8192Callback">تابعی که داده های اسپکتروم 8192 تایی دریافت میکند</param>
        public static void ProcessForierTransfer(short[] sampleData,
                                                 FrequencyDataReceiverDelegate Callback, int bin)

        {
            // تبدیل داده های صحیح به داده های اعشاری کوچک جهت انجام محاسبات مثلثاتی
            double[] fSampleData         = new double[sampleData.Length];
            double[] fSampleDataOriginal = new double[sampleData.Length];
            for (int i = 0; i < sampleData.Length; i++)
            {
                fSampleDataOriginal[i] = fSampleData[i] = ((double)sampleData[i]) / 32768.0;
            }

            // اِعمال تابع پنجره به داده های اعشاری
            SoundAnalysis.Filters.WindowFilter windowFilter = new SoundAnalysis.Filters.WindowFilter(bin);
            windowFilter.ProcessData(null, fSampleData);


            // تقسیم داده ها به تکه های 8192 تایی و اِعمال تبدیل فوریه
            int count = sampleData.Length / bin;

            for (int pos = 0; pos < count; pos++)
            {
                // تبدیل فوریه
                double[] spec    = SoundAnalysis.FourierTransform.Compute(fSampleData, bin, pos);
                double[] samples = new double[bin];
                Array.Copy(fSampleDataOriginal, pos * bin, samples, 0, bin);
                Callback(spec, samples);
            }
        }