سؤال

محاولة فهم روتين fft (تحويل فورييه السريع) الذي أستخدمه (السرقة) (إعادة التدوير)

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

========================================

معدل العينة هو 1000 عينة / ثانية.توليد مجموعة من العينات في 10 هرتز.

تحتوي صفيف الإدخال على قيم ذروة عند arr(28)، arr(128)، arr(228) ...الفترة = 100 نقطة عينة

قيمة الذروة في صفيف fft عند الفهرس 6 (باستثناء القيمة الضخمة عند 0)

========================================

معدل العينة هو 8000 عينة/s توليد مجموعة من العينات في 440 هرتز

تتضمن قيم ذروة صفيف الإدخال arr(7)، arr(25)، arr(43)، arr(61) ...الفترة = 18 نقطة عينة

قيمة الذروة في صفيف fft هي عند المؤشر 29 (باستثناء القيمة الضخمة عند 0)

========================================

كيف يمكنني ربط مؤشر الذروة في صفيف ft بالتردد؟

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

المحلول

إذا تجاهلت الجزء التخيلي، فإن التوزيع التكراري يكون خطيًا عبر الصناديق:

التردد@i = (معدل أخذ العينات/2)*(i/Nbins).

لذلك بالنسبة للمثال الأول، بافتراض أن لديك 256 حاوية، فإن أكبر حاوية تتوافق مع تردد 1000/2 * 6/256 = 11.7 هرتز.نظرًا لأن مدخلاتك كانت 10 هرتز، أعتقد أن الحاوية 5 (9.7 هرتز) تحتوي أيضًا على مكون كبير.للحصول على دقة أفضل، تحتاج إلى أخذ المزيد من العينات، للحصول على صناديق أصغر.

المثال الثاني يعطي 8000/2*29/256 = 453 هرتز.أغلق مرة أخرى، لكنك بحاجة إلى المزيد من الصناديق.الدقة الخاصة بك هنا هي 4000/256 = 15.6 هرتز فقط.

نصائح أخرى

سيكون من المفيد أن تقدم مجموعة البيانات النموذجية الخاصة بك.

أعتقد أن لديك ما يسمى بأخذ العينات.تشير الإشارة القوية عند DC (التردد 0) إلى أن هذا هو الحال.

يجب عليك دائمًا التأكد من أن متوسط ​​القيمة في بيانات الإدخال الخاصة بك هو صفر - يعد العثور على المتوسط ​​وطرحه من كل نقطة عينة قبل استدعاء fft ممارسة جيدة.

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

خلاصة القول هي أن إجراء تحليل FFT يتطلب المزيد من العناية من مجرد إعادة تدوير روتين FFT الموجود في مكان ما.

فيما يلي أول 100 نقطة عينة لإشارة 10 هرتز كما هو موضح في السؤال، والتي تم تدليكها لتجنب أخذ العينات المصطنعة

> sinx[1:100]
  [1]  0.000000e+00  6.279052e-02  1.253332e-01  1.873813e-01  2.486899e-01  3.090170e-01  3.681246e-01  4.257793e-01  4.817537e-01  5.358268e-01
 [11]  5.877853e-01  6.374240e-01  6.845471e-01  7.289686e-01  7.705132e-01  8.090170e-01  8.443279e-01  8.763067e-01  9.048271e-01  9.297765e-01
 [21]  9.510565e-01  9.685832e-01  9.822873e-01  9.921147e-01  9.980267e-01  1.000000e+00  9.980267e-01  9.921147e-01  9.822873e-01  9.685832e-01
 [31]  9.510565e-01  9.297765e-01  9.048271e-01  8.763067e-01  8.443279e-01  8.090170e-01  7.705132e-01  7.289686e-01  6.845471e-01  6.374240e-01
 [41]  5.877853e-01  5.358268e-01  4.817537e-01  4.257793e-01  3.681246e-01  3.090170e-01  2.486899e-01  1.873813e-01  1.253332e-01  6.279052e-02
 [51] -2.542075e-15 -6.279052e-02 -1.253332e-01 -1.873813e-01 -2.486899e-01 -3.090170e-01 -3.681246e-01 -4.257793e-01 -4.817537e-01 -5.358268e-01
 [61] -5.877853e-01 -6.374240e-01 -6.845471e-01 -7.289686e-01 -7.705132e-01 -8.090170e-01 -8.443279e-01 -8.763067e-01 -9.048271e-01 -9.297765e-01
 [71] -9.510565e-01 -9.685832e-01 -9.822873e-01 -9.921147e-01 -9.980267e-01 -1.000000e+00 -9.980267e-01 -9.921147e-01 -9.822873e-01 -9.685832e-01
 [81] -9.510565e-01 -9.297765e-01 -9.048271e-01 -8.763067e-01 -8.443279e-01 -8.090170e-01 -7.705132e-01 -7.289686e-01 -6.845471e-01 -6.374240e-01
 [91] -5.877853e-01 -5.358268e-01 -4.817537e-01 -4.257793e-01 -3.681246e-01 -3.090170e-01 -2.486899e-01 -1.873813e-01 -1.253332e-01 -6.279052e-02

وهنا القيم المطلقة الناتجة لمجال التردد FFT

 [1] 7.160038e-13 1.008741e-01 2.080408e-01 3.291725e-01 4.753899e-01 6.653660e-01 9.352601e-01 1.368212e+00 2.211653e+00 4.691243e+00 5.001674e+02
[12] 5.293086e+00 2.742218e+00 1.891330e+00 1.462830e+00 1.203175e+00 1.028079e+00 9.014559e-01 8.052577e-01 7.294489e-01

أنا صدئ قليلاً أيضًا في الرياضيات ومعالجة الإشارات ولكن مع المعلومات الإضافية يمكنني تجربتها.

إذا كنت تريد معرفة طاقة الإشارة لكل صندوق، فأنت بحاجة إلى حجم الإخراج المعقد.لذا فإن مجرد النظر إلى الناتج الحقيقي لا يكفي.حتى عندما يكون الإدخال أرقامًا حقيقية فقط.لكل صندوق حجم الإخراج هو sqrt(real^2 + imag^2)، تمامًا مثل فيثاغورس :-)

الصناديق من 0 إلى 449 هي ترددات موجبة من 0 هرتز إلى 500 هرتز.الخانات من 500 إلى 1000 هي ترددات سلبية ويجب أن تكون نفس الترددات الإيجابية للإشارة الحقيقية.إذا قمت بمعالجة مخزن مؤقت واحد كل ترددات ثانية وتصطف مؤشرات الصفيف بشكل جيد.لذا فإن الذروة عند المؤشر 6 تتوافق مع 6 هرتز، لذا فهذا غريب بعض الشيء.قد يكون هذا بسبب أنك تنظر فقط إلى بيانات المخرجات الحقيقية وتجتمع البيانات الحقيقية والتخيلية لتعطي ذروة متوقعة عند المؤشر 10.يجب أن يتم تعيين الترددات خطيًا إلى الصناديق.

تشير القمم عند 0 إلى إزاحة التيار المستمر.

لقد مر بعض الوقت منذ أن قمت بإجراء FFT ولكن هذا ما أتذكره

عادةً ما يأخذ FFT الأرقام المعقدة كمدخلات ومخرجات.لذلك لست متأكدًا حقًا من كيفية تعيين الجزء الحقيقي والخيالي من الإدخال والإخراج إلى المصفوفات.

أنا لا أفهم حقًا ما تفعله.في المثال الأول، تقول إنك تقوم بمعالجة المخازن المؤقتة للعينة عند 10 هرتز بمعدل عينة يبلغ 1000 هرتز؟لذلك يجب أن يكون لديك 10 مخازن مؤقتة في الثانية تحتوي كل منها على 100 عينة.لا أفهم كيف يمكن أن يصل طول مجموعة الإدخال الخاصة بك إلى 228 عينة على الأقل.

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

تردد bin i هو i * (samplerate / n)، حيث n هو عدد العينات في نافذة إدخال FFT.

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

لقد ذكرت حاوية ذات قيمة كبيرة عند 0 - هذه هي الحاوية ذات التردد 0، أي.مكون العاصمةإذا كان هذا كبيرًا، فمن المفترض أن تكون قيمك إيجابية بشكل عام.Bin n/2 (في حالتك 256) هو تردد Nyquist، وهو نصف معدل العينة، وهو أعلى تردد يمكن حله في الإشارة التي تم أخذ عينات منها بهذا المعدل.

إذا كانت الإشارة حقيقية، فإن الخانات n/2+1 إلى n-1 ستحتوي على اتحادات معقدة من الخانات n/2-1 إلى 1، على التوالي.تظهر قيمة DC مرة واحدة فقط.

العينات، كما قال آخرون، متباعدة بالتساوي في مجال التردد (وليس لوغاريتمي).

على سبيل المثال 1، يجب أن تحصل على هذا:

نص بديل http://home.comcast.net/~kootsoop/images/SINE1.jpg

بالنسبة للمثال الآخر يجب أن تحصل عليه

نص بديل http://home.comcast.net/~kootsoop/images/SINE2.jpg

لذا يبدو أن إجابتك صحيحة فيما يتعلق بموقع الذروة.

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

طريق آخر هو صياغة أ خوارزمية جورتزل لكل تردد لمركز الملاحظات الذي تبحث عنه.

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

خوارزمية Goertzel هي في الأساس حاوية واحدة FFT.باستخدام هذه الطريقة، يمكنك وضع الصناديق الخاصة بك لوغاريتميًا مع ظهور النوتات الموسيقية بشكل طبيعي.

بعض التعليمات البرمجية الزائفة من ويكيبيديا:

s_prev = 0
s_prev2 = 0
coeff = 2*cos(2*PI*normalized_frequency);
for each sample, x[n],
  s = x[n] + coeff*s_prev - s_prev2;
  s_prev2 = s_prev;
  s_prev = s;
end
power = s_prev2*s_prev2 + s_prev*s_prev - coeff*s_prev2*s_prev;

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

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

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

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

-ريك

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