Пример #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);
            }
        }
Пример #2
0
        /// <summary>
        /// دریافت فرکانسهای داده نمونه
        /// </summary>
        /// <param name="sampleData">داده های نمونه</param>
        /// <param name="bin1024Callback">تابعی که داده های اسپکتروم 1024 تایی دریافت میکند</param>
        /// <param name="bin8192Callback">تابعی که داده های اسپکتروم 8192 تایی دریافت میکند</param>
        public static void ProcessForierTransfer(short[] sampleData,
                                                 FrequencyDataReceiverDelegate bin1024Callback,
                                                 FrequencyDataReceiverDelegate bin8192Callback)
        {
            // اختصاص حافظه مناسب به فیلد ها
            CheckInit(sampleData.Length);

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

            // اِعمال تابع پنجره به داده های اعشاری
            windowFilter1024.ProcessData(null, fSampleDataWnd1024);
            windowFilter8192.ProcessData(null, fSampleDataWnd8192);


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

            for (int pos = 0; pos < count; pos++)
            {
                // تبدیل فوریه
                double[] spec8192 = SoundAnalysis.FourierTransform.Compute(fSampleDataWnd8192, 8192, pos);

                // داده های نمونه این رنج
                double[] samples8192 = new double[8192];
                Array.Copy(fSampleDataOrg, pos * 8192, samples8192, 0, 8192);

                bin8192Callback(spec8192, samples8192);

                //  تبدیل فوریه زیر مجموعه با بازه های کوچک تر 1024 تایی
                for (int subpos = 0; subpos < 8; subpos++)
                {
                    double[] spec1024 = SoundAnalysis.FourierTransform.Compute(fSampleDataWnd1024, 1024, (pos * 8) + subpos);
                    // داده های نمونه این رنج
                    double[] samples1024 = new double[8192];
                    Array.Copy(fSampleDataOrg, subpos * 1024, samples1024, 0, 1024);

                    bin1024Callback(spec1024, samples1024);
                }
            }
        }