سؤال

أحاول إنشاء محلل طيف رسومي في بيثون.

أقوم حاليًا بقراءة 1024 بايت من دفق صوتي بمعدل عينة 16 بت مزدوج القناة يبلغ 44100 هرتز ومتوسط ​​سعة القناتين معًا.إذن لدي الآن مجموعة من 256 فيلمًا قصيرًا موقعًا.أريد الآن إنشاء fft على تلك المصفوفة، باستخدام وحدة نمطية مثل numpy، واستخدام النتيجة لإنشاء محلل الطيف الرسومي، والذي سيكون في البداية 32 شريطًا فقط.

لقد قرأت مقالات ويكيبيديا عن تحويل فورييه السريع وتحويل فورييه المنفصل ولكني ما زلت غير واضح بشأن ما يمثله المصفوفة الناتجة.هذا هو الشكل الذي تبدو عليه المصفوفة بعد أن أقوم بإجراء fft على المصفوفة الخاصة بي باستخدام numpy:

   [ -3.37260500e+05 +0.00000000e+00j   7.11787022e+05 +1.70667403e+04j
   4.10040193e+05 +3.28653370e+05j   9.90933073e+04 +1.60555003e+05j
   2.28787050e+05 +3.24141951e+05j   2.09781047e+04 +2.31063376e+05j
  -2.15941453e+05 +1.63773851e+05j  -7.07833051e+04 +1.52467334e+05j
  -1.37440802e+05 +6.28107674e+04j  -7.07536614e+03 +5.55634993e+03j
  -4.31009964e+04 -1.74891657e+05j   1.39384348e+05 +1.95956947e+04j
   1.73613033e+05 +1.16883207e+05j   1.15610357e+05 -2.62619884e+04j
  -2.05469722e+05 +1.71343186e+05j  -1.56779748e+04 +1.51258101e+05j
  -2.08639913e+05 +6.07372799e+04j  -2.90623668e+05 -2.79550838e+05j
  -1.68112214e+05 +4.47877871e+04j  -1.21289916e+03 +1.18397979e+05j
  -1.55779104e+05 +5.06852464e+04j   1.95309737e+05 +1.93876325e+04j
  -2.80400414e+05 +6.90079265e+04j   1.25892113e+04 -1.39293422e+05j
   3.10709174e+04 -1.35248953e+05j   1.31003438e+05 +1.90799303e+05j...

أتساءل ما الذي تمثله هذه الأرقام بالضبط وكيف يمكنني تحويل هذه الأرقام إلى نسبة مئوية من الارتفاع لكل شريط من الأشرطة الـ 32.أيضًا، هل يجب أن أقوم بتوسيط القناتين معًا؟

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

المحلول

المصفوفة التي تعرضها هي معاملات تحويل فورييه للإشارة الصوتية.يمكن استخدام هذه المعاملات للحصول على محتوى التردد للصوت.يتم تعريف FFT لوظائف الإدخال ذات القيمة المعقدة، وبالتالي فإن المعاملات التي تحصل عليها ستكون أرقامًا خيالية على الرغم من أن مدخلاتك كلها قيم حقيقية.من أجل الحصول على مقدار الطاقة في كل تردد، تحتاج إلى حساب مقدار معامل FFT لكل تردد.هذا هو لا فقط المكون الحقيقي للمعامل، تحتاج إلى حساب الجذر التربيعي لمجموع مربع مكوناته الحقيقية والتخيلية.بمعنى، إذا كان المعامل الخاص بك هو a + b*j، فإن حجمه هو sqrt(a^2 + b^2).

بمجرد قيامك بحساب حجم كل معامل FFT، ستحتاج إلى معرفة التردد الصوتي الذي ينتمي إليه كل معامل FFT.ستمنحك نقطة N FFT محتوى تردد إشارتك عند N ترددات متساوية التباعد، بدءًا من 0.لأن تردد أخذ العينات الخاص بك هو 44100 عينة / ثانية.وعدد النقاط في FFT الخاص بك هو 256، وتباعد التردد لديك هو 44100 / 256 = 172 هرتز (تقريبًا)

سيكون المعامل الأول في مصفوفتك هو معامل التردد 0.هذا هو في الأساس متوسط ​​مستوى الطاقة لجميع الترددات.سيتم حساب باقي معاملاتك من 0 بمضاعفات 172 هرتز حتى تصل إلى 128.في تحويل فورييه السريع (FFT)، يمكنك فقط قياس الترددات حتى نصف نقاط العينة الخاصة بك.إقرأ هذه الروابط على تردد نيكويست و نظرية أخذ العينات نيكويست-شانون إذا كنت شرهًا للعقاب وتريد معرفة السبب، ولكن النتيجة الأساسية هي أن الترددات المنخفضة لديك سيتم تكرارها أو مستعار في دلاء التردد العالي.لذلك ستبدأ الترددات من 0، وتزيد بمقدار 172 هرتز لكل معامل حتى معامل N/2، ثم تنخفض بمقدار 172 هرتز حتى معامل N-1.

يجب أن تكون هذه معلومات كافية للبدء.إذا كنت ترغب في الحصول على مقدمة أكثر سهولة عن FFTs مما هو مذكور في ويكيبيديا، فيمكنك تجربتها فهم معالجة الإشارات الرقمية:الطبعة الثانية..كان ذلك مساعدا جدا لي.

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

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

نصائح أخرى

على الرغم من أن هذا الموضوع عمره سنوات، إلا أنني وجدته مفيدًا جدًا.أردت فقط أن أقدم مدخلاتي لأي شخص يجد هذا ويحاول إنشاء شيء مماثل.

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

اعتمادًا على عدد الأشرطة التي تريدها، يمكنك تقسيم النطاق بأكمله إلى نطاقات 1/X أوكتاف.بناءً على تردد مركزي معين لـ A على الشريط، يمكنك الحصول على الحدود العليا والدنيا للشريط من:

upper limit = A * 2 ^ ( 1 / 2X )
lower limit = A / 2 ^ ( 1 / 2X )

لحساب تردد المركز المجاور التالي، يمكنك استخدام عملية حسابية مماثلة:

next lower =  A / 2 ^ ( 1 / X )
next higher = A * 2 ^ ( 1 / X )

يمكنك بعد ذلك حساب متوسط ​​البيانات التي تناسب هذه النطاقات للحصول على سعة كل شريط.

على سبيل المثال:نريد أن نقسم إلى نطاقات 1/3 أوكتاف ونبدأ بتردد مركزي قدره 1 كيلو هرتز.

Upper limit = 1000 * 2 ^ ( 1 / ( 2 * 3 ) ) = 1122.5
Lower limit = 1000 / 2 ^ ( 1 / ( 2 * 3 ) ) =  890.9

بالنظر إلى 44100 هرتز و1024 عينة (43 هرتز بين كل نقطة بيانات)، يجب علينا حساب متوسط ​​القيم من 21 إلى 26.( 890.9 / 43 = 20.72 ~ 21 و 1122.5 / 43 = 26.10 ~ 26 )

(ستوفر لك أشرطة 1/3 أوكتاف حوالي 30 بارًا بين ~ 40 هرتز و ~ 20 كيلو هرتز).كما يمكنك أن تكتشف الآن، كلما ارتفعنا إلى أعلى، سنحصل على متوسط ​​نطاق أكبر من الأرقام.تتضمن الأشرطة المنخفضة عادةً نقطة واحدة فقط أو عددًا صغيرًا من نقاط البيانات.في حين أن الأشرطة الأعلى يمكن أن تكون متوسط ​​مئات النقاط.والسبب هو أن 86 هرتز هو أوكتاف أعلى من 43 هرتز ...بينما 10086 هرتز يبدو تقريبًا نفس 10043 هرتز.

ما لديك هو عينة يبلغ طولها الزمني 256/44100 = 0.00580499 ثانية.هذا يعني أن دقة التردد لديك هي 1 / 0.00580499 = 172 هرتز.تتوافق القيم الـ 256 التي حصلت عليها من بايثون مع الترددات، بشكل أساسي، من 86 هرتز إلى 255*172+86 هرتز = 43946 هرتز.الأرقام التي تحصل عليها هي أرقام معقدة (ومن هنا الحرف "j" في نهاية كل رقم ثانٍ).

تم التعديل:معلومات خاطئة ثابتة

تحتاج إلى تحويل الأعداد المركبة إلى سعة عن طريق حساب قيمة sqrt(i2 + ي2) حيث i و j هما الجزءان الحقيقيان والتخيليان، resp.

إذا كنت تريد أن يكون لديك 32 بارًا، فيجب عليك على حد علمي أن تأخذ متوسط ​​أربعة سعات متتالية، لتحصل على 256/4 = 32 بارًا كما تريد.

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