/// <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); } }
/// <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); } } }