تقنية

FFT: هل يعيد العكس المدخل عند تغيير norm؟

ثلاثة أوضاع للمدخل نفسه.
المعاملات تتغير بعامل معلوم.

يحدد norm جهة تحجيم زوج التحويل والعكس في NumPy. [1][2] نختبر أثر مطابقته وتغييره في متتالية مؤلفة.

ثبّت طول المدخل ومعنى الوضع

في backward يبقى التحويل الأمامي دون تحجيم، ويقسم العكس على N. في forward تقسم الجهة الأمامية على N ويترك العكس دون هذه القسمة. في ortho تقسم الجهتان على جذر N. [3]

نؤلف x=[3,−2,5,1] بطول N=4، ونمررها بنوع float64 على NumPy 2.3.5. لا نختار معدل عينات أو وحدة فيزيائية، ولا نستخدم إشارة مقاسة من جهاز.

نستدعي np.fft.fft(x,norm="backward") صراحة. أعاد [7+0i,−2+3i,9+0i,−2−3i] بنوع complex128 وشكل (4,). لم نغير طول المدخل أو نضف أصفارًا.

نحسب مرجعًا مستقلًا بجذور الأربع: عند الفهرس صفر نجمع 3−2+5+1=7. عند الأول نحصل على 3+(−2)(−i)−5+i=−2+3i. عند الثاني 3+2+5−1=9، وعند الثالث −2−3i.

يبين المرجع ترتيب الفهارس من صفر إلى ثلاث واتجاه الأس السالب. [3] لا نستعمل خرج تحويل آخر جوابًا منتظرًا، ولا نستنتج زمن تنفيذ من هذه الحسابات.

قارن المعاملات قبل اختيار العكس

مع طول أربع يكون جذر N مساويًا لاثنين. أعاد fft بوضع ortho القائمة [3.5,−1+1.5i,4.5,−1−1.5i]، أي نصف معاملات backward في هذا المثال.

وأعاد fft بوضع forward القائمة [1.75,−0.5+0.75i,2.25,−0.5−0.75i]، أي ربع المعاملات الأولى. ظلت القوائم الأربع عناصر وذات ترتيب الفهارس نفسه.

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

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

احسب عامل الزوج المختلط

مررنا معاملات forward إلى np.fft.ifft(...,norm="backward"). أعاد [0.75,−0.5,1.25,0.25] مع أجزاء تخيلية صفرية: ربع المدخل، لا المدخل نفسه.

أما عكس المعاملات نفسها بوضع forward فأعاد [3,−2,5,1]. وعكسها بوضع ortho أعاد [1.5,−1,2.5,0.5]، وهو نصف المدخل. لم نبدل المعاملات بين هذه الاستدعاءات.

نسمي عامل الأمامي α وعامل جمع العكس β. جمع جذور الأربع في الاتجاهين يعطي 4x قبل عاملي التحجيم؛ لذلك يصبح الناتج 4αβ×x. قيم α هي {1,1/2,1/4}، وقيم β هي {1/4,1/2,1} بترتيب backward ثم ortho ثم forward.

مثلًا زوج forward ثم backward يعطي 4×1/4×1/4=1/4. زوج backward ثم forward يعطي 4×1×1=4، وأعاد [12,−8,20,4]. اختلاف العامل قد يصغر القيم أو يكبرها.

يعرض الجدول عامل المدخل لكل زوج في حساب الأربع نقاط. قطره يساوي واحدًا؛ في الأزواج المختلطة يظهر 2 أو 4 أو 1/2 أو 1/4. هذا تفسير حسابي، وليس تغييرًا في أسماء فهارس التردد.

عوامل الأزواج التسعة.
التطابق على قطر الجدول.

لا تجعل الصفر اختبارك الوحيد

اخترنا التحكم [0,0,0,0] مستقلًا عن المثال. أعادت الأزواج التسعة أصفارًا؛ أي عامل من العوامل السابقة يبقي الصفر صفرًا. الاتفاق هنا لا يكشف خطأ التحجيم.

أضفنا التركيبات الستة عشر للقيم {−1,2} في أربع خانات. مع المثال والتحكم أصبح لدينا 18 مدخلًا مختلفًا. نفذنا ثلاث جهات أمامية لكل مدخل، ثم عكس كل ناتج بالأوضاع الثلاثة.

المجموع 54 استدعاء fft و162 استدعاء ifft، أي 216 استدعاءً مسمى، و864 عنصر مخرج مركب. أنشأنا 18 مصفوفة مدخل مستقلة؛ العنصر المركب يعد واحدًا رغم حفظ جزأيه في JSON.

فحصنا الأشكال والأنواع وثبات بايتات المدخل والطيف عند العكس، وقارنّا القيم بمرجع الكسور والجذور المستقل. كان الفرق المحفوظ صفرًا في هذه المجموعة، ضمن حد مطلق 10⁻¹²؛ لا نعمم التطابق الدقيق على مدخلات عائمة أخرى.

من 162 مقارنة مع الأصل اتفقت 60 واختلفت 102. لكل مدخل غير صفري اتفقت الأزواج الثلاثة المتطابقة فقط؛ أضاف التحكم الصفري ستة اتفاقات مختلطة.

نقصر الفحص على طول أربع وfloat64 والأوضاع الثلاثة الصريحة. لم نختبر None الافتراضي أو أطوالًا ومحاور وأنواعًا أخرى أو حشوًا أو تحويلًا حقيقيًا مختصرًا أو أداءً. راجع إعداد الأمامي والعكس معًا قبل الحكم بأن قائمة مستعادة تمثل الأصل.

وضع الأمامي / العكسbackwardorthoforward
backward124
ortho1/212
forward1/41/21

للتوسع: تطبيع صف بطوله.

المراجع

  1. NumPy fft
  2. NumPy ifft
  3. NumPy DFT normalization

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