التحليل الرياضي لعينة صوتية (كمجموعة من الأرقام)

StackOverflow https://stackoverflow.com/questions/87262

  •  01-07-2019
  •  | 
  •  

سؤال

أحتاج إلى العثور على تردد العينة المخزنة (في vb) كصفيف من البايت.العينة عبارة عن موجة جيبية، وتردد معروف، حتى أتمكن من التحقق)، ولكن الأرقام غريبة بعض الشيء، ومعلومات الرياضيات الخاصة بي ضعيفة.النطاق الكامل للقيم 0-255.99% من الأرقام تقع في النطاق من 235 إلى 245، ولكن هناك بعض القيم المتطرفة تصل إلى 0 و1، وتصل إلى 255 في الـ 1% المتبقية.كيف يمكنني تطبيع ذلك لإزالة القيم المتطرفة (حساب الفاصل الزمني 235-245 لأنه قد يتغير مع عينات مختلفة)، وكيف يمكنني بعد ذلك حساب التقاطع الصفري للحصول على التكرار؟أعتذر إذا كان هذا الوصف هراء!

هل كانت مفيدة؟

المحلول

من المحتمل أن يكون FFT هو أفضل إجابة، ولكن إذا كنت تريد فعل ذلك بطريقتك الخاصة، فجرّب ما يلي:

للتطبيع، قم أولاً بإنشاء رسم بياني لحساب عدد تكرارات كل قيمة من 0 إلى 255.ثم قم بطرح X بالمائة من القيم من كل طرف بشيء مثل:

for (i=lower=0;i< N*(X/100); lower++)
  i+=count[lower];
//repeat in other direction for upper

الآن تطبيع مع

A[i] = 255*(A[i]-lower)/(upper-lower)-128

تخلص من النتائج خارج النطاق -128..127.

الآن يمكنك حساب المعابر الصفرية.للتأكد من عدم خداعك بالضوضاء، قد ترغب في تتبع المنحدر خلال النقاط العديدة الأخيرة، وحساب نقاط العبور فقط عندما يسير المنحدر المتوسط ​​في الاتجاه الصحيح.

نصائح أخرى

الطريقة القياسية لمعالجة هذه المشكلة هي النظر في كتلة واحدة من البيانات، ونأمل أن يكون ضعف التكرار الفعلي على الأقل (أخذ المزيد من البيانات ليس أمرًا سيئًا، لذلك من الجيد المبالغة في تقديرها قليلاً)، ثم خذ تحويل فوري مباشر وتخمين أن التردد يتوافق مع أكبر رقم في طيف FFT الناتج.

بالمناسبة، لقد تم طرح مشكلات مشابهة جدًا هنا من قبل - يمكنك البحث عن تلك الإجابات أيضًا.

استخدم تحويل فورييه، وهو أقل حساسية للضوضاء من حساب الصفر

يحرر:@WaveyDavey

لقد وجدت مكتبة F# لإجراء FFT: من هنا

كما اتضح ، فإن أفضل تطبيق مجاني وجدته لمستخدمي F# حتى الآن لا يزال مكتبة FFTW الرائعة.يحتوي موقعهم على Windows DLL.لقد كتبت الحد الأدنى من الارتباطات التي تسمح بالوصول الآمن للموضوع إلى FFTW من F#، مع كل من المعلم والواجهات البسيطة.الأداء ممتاز ، ويندوز إكس بي برو 32 بت أقل بنسبة 35 ٪ فقط من Linux 64 بت.

الآن أنا متأكد من أنه يمكنك استدعاء F# lib من VB.net وC# وما إلى ذلك، والذي يجب أن يكون في مستنداتهم

إذا فهمت جيدًا من وصفك، فإن ما لديك هو إشارة عبارة عن مزيج من جيب زائد ثابت بالإضافة إلى بعض الأخطاء العشوائية.قل مثل

x[n] = A*sin(f*n + phi) + B + N[n]

حيث N[n] هو ضجيج "الخلل" الذي تريد التخلص منه.

إذا كانت مواطن الخلل عبارة عن عينة واحدة طويلة، فيمكنك إزالتها باستخدام مرشح متوسط ​​يجب أن يكون أكبر من طول الخلل.على كلا الجانبين من خلل.مواطن الخلل في الطول 1 تعني أنه سيكون لديك ما يكفي بمتوسط ​​3 عينات من الطول.

y[n] = median3(x[n])

يتم حساب الوسيط على النحو التالي:خذ عينات x التي تريد تصفيتها (x[n-1],x[n],x[n+1])، وقم بفرزها، ويكون الناتج هو الأوسط.

الآن بعد أن اختفت إشارة الضوضاء، تخلص من الإشارة الثابتة.أتفهم أن المخزن المؤقت ذو طول محدود ومعروف، لذا يمكنك فقط حساب متوسط ​​المخزن المؤقت بأكمله.اطرحه.

الآن لديك إشارة جيبية واحدة.يمكنك الآن حساب التردد الأساسي عن طريق حساب المعابر الصفرية.قم بحساب كمية العينات التي تزيد عن 0 والتي كانت فيها العينة السابقة أقل من 0.الفترة هي إجمالي كمية عينات المخزن المؤقت مقسومًا على هذا، والتكرار هو معاكس (1/x) للفترة.

على الرغم من أنني سأتفق مع الأغلبية وأقول أنه يبدو أن ما تريده هو حل fft (خوارزمية fft سريعة جدًا)، إذا لم يكن fft هو الحل لأي سبب من الأسباب، فقد ترغب في محاولة تركيب منحنى جيبي على البيانات باستخدام برنامج مناسب وقراءة التردد المجهز.

استخدام فيتيك, ، يمكنك تحميل البيانات وتناسبها a*sin(b*x-c) أين 2*pi/b سوف أعطيك التردد بعد التركيب.

يمكن استخدام Fityk من واجهة المستخدم الرسومية ومن سطر الأوامر للبرمجة النصية ويحتوي على واجهة برمجة تطبيقات C++ بحيث يمكن تضمينها في برامجك مباشرةً.

لقد بحثت في Google عن "FFT الأساسي". فيجوال بيسك FFT سؤالك يصرخ FFT، ولكن كن حذرًا، فإن استخدام FFT دون فهم ولو قليلاً عن DSP يمكن أن يؤدي إلى نتائج لا تفهمها أو لا تعرف من أين أتت.

احصل على محلل التردد في http://www.relisoft.com/Freeware/index.htm وتشغيله وإلقاء نظرة على التعليمات البرمجية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top