اگر سیگنال را قطعهقطعه فیلتر کنیم، خروجیِ هر قطعه کمی بلندتر میشود. چسباندنِ سادهٔ این خروجیها یا بریدنِ دنبالهٔ هرکدام، همان فیلترکردنِ کلِ سیگنال نیست. Overlap-add سهمهایِ هممکان را جمع و دنبالهٔ معلق را به قطعهٔ بعدی منتقل میکند؛ پایانِ جریان نیز یک flush مشخص میخواهد.
پنج ورودی، سه ضریبِ فیلتر
دنبالهٔ اصیل x=[۱، ۲، ۳، ۴، ۵] و h=[۱، −۱، ۲] را به قطعههایِ ۲، ۲ و ۱ عضوی میشکنیم. کانولوشنِ کاملِ کلِ ورودی طولِ ۵+۳−۱=۷ دارد. کدِ محلی برای هر قطعه، کانولوشنِ مستقیمِ عددی میسازد؛ FFT، صدایِ واقعی یا SciPy در آن اجرا نمیشود.
قطعهٔ اول[۱، ۲] خروجیِ[۱، ۱، ۰، ۴] میدهد. دو خانهٔ نخست اکنون قابلِ تحویلاند؛ دو خانهٔ[۰، ۴] دنبالهٔ معلقاند. دورریختنِ این دو، سهمِ فیلترِ همین قطعه در مکانهایِ بعدی را پاک میکند، نه نویزِ اضافه را.
دنبالهٔ قبلی را به خروجیِ بعدی بیفزاییم
قطعهٔ دوم[۳، ۴] بهتنهایی[۳، ۱، ۲، ۸] میدهد. دو مقدارِ دنبالهٔ قبلی به دو خانهٔ آغازِ آن اضافه میشوند و[۳، ۵، ۲، ۸] میسازند. اکنون[۳، ۵] تحویل و[۲، ۸] برای مرحلهٔ بعد نگه داشته میشود. offset شروعِ این قطعه ۲ است؛ مکانِ نمونه ازابتدایِ جریان معنا دارد.
آخرین قطعه فقط[۵] است و خروجیِ محلیِ[۵، −۵، ۱۰] دارد. افزودنِ دنبالهٔ قبلی، [۷، ۳، ۱۰] میسازد. یک خانهٔ ۷ تحویل میدهیم ودو خانهٔ[۳، ۱۰] هنوز باقیاند؛ کوتاهبودنِ قطعهٔ آخر، دلیلِ حذفِ این دو خانه نیست.
| قطعه | پس از افزودنِ carry | تحویل | دنباله |
|---|---|---|---|
| ۱، ۲ | ۱، ۱، ۰، ۴ | ۱، ۱ | ۰، ۴ |
| ۳، ۴ | ۳، ۵، ۲، ۸ | ۳، ۵ | ۲، ۸ |
| ۵ | ۷، ۳، ۱۰ | ۷ | ۳، ۱۰ |
پایانِ جریان یک قرارداد است
پس از آخرین ورودی، flush دقیقاً یکبار دنبالهٔ[۳، ۱۰] را تحویل میدهد. کلِ پاسخ[۱، ۱، ۳، ۵، ۷، ۳، ۱۰] است. کد، flush دوباره و افزودنِ ورودی پس از نهاییشدن را رد میکند؛ تکرارِ flush نباید دو نمونهٔ آخر را دوباره بسازد.
چسباندنِ خامِ سه خروجیِ محلی ۱۱ خانه میدهد، نه ۷ خانه. بریدنِ هرکدام به طولِ قطعه نیز[۱، ۱، ۳، ۱، ۵] میدهد و سهمِ همپوشان را از دست میدهد. هر دو مسیرِ غلط واقعاً ساخته شدهاند و صرفاً از رویِ نامِ روش حدس زده نشدهاند.
هر شانزده تقسیمِ همین ورودی را بسنجیم
تمام ۱۶ تقسیمِ مثبتِ دنبالهٔ پنجعضوی اجرا میشود. در هرکدام، پاسخِ جریان با np.convolve واقعی در modefull و مرجعِ مستقلِ جمعِ ضریبِ کل برابر است. قطعههایِ تکعضوی، فیلترِ طول ۱ وورودیِ ضربه نیز جدا کنترل شدهاند؛ همهٔ حالتها را با یک اندازهٔ بلوک نپوشاندهایم.
هفت حالتِ نامعتبر، از فیلتر یاقطعهٔ خالی و bool تا قطعهٔ بزرگ، flush بدونِ ورودی و دو وضعیتِ نهایی، رد میشوند. هر قطعه حداکثر ۸ عضو، کلِ ورودی ۱۶ و فیلتر ۵ ضریب دارد. در این قرارداد، state معلق M−۱ خانه است؛ اما trace وخروجیِ کاملِ نگهداشتهشده O(N) حافظه دارند.
روشِ محلی را با سنجشِ سرعت یکی نکنیم
منبعِ DSP روشِ overlap-add وکاربردِ FFT برای کانولوشنِ محلی را توضیح میدهد. تمرینِ ما از ضرب و جمعِ مستقیم استفاده میکند؛ هیچ برتریِ سرعت یا تضمینِ تأخیر از آن نتیجه نمیشود. NumPy۲٫۳٫۵ فقط مرجعِ مستقلِ پاسخِ کاملِ این دنبالهٔ کوچک است.
کانولوشنِ خطی و دوری اثرِ padding و FFT را میسنجد؛ اینجا carry و emit و flush واقعاً اجرا میشوند. چسباندنِ PCM نمونههایِ خامِ سازگار را وصل میکند و فیلتر نمیسازد. ادامه در مبانی هوش مصنوعی؛ این عددها آزمونِ کیفیتِ صوت یا قابلیتِ پردازشِ زندهٔ اپرا نیستند.
فایل تمرین و منبع
کد کاملِ تمرینِ مستقل و کنترلها؛ Python · ورودی و تمامِ خروجیِ اجرای واقعی؛ JSON
- SciPy۱٫۱۸؛ تعریفِ overlap-add وطولِ خروجیِ full خوانده شد؛ کتابخانه و ادعایِ عملکردش در این تمرین اجرا یا سنجیده نشده
- Smith، فصل ۱۸، متنِ صفحاتِ چاپی ۳۱۱ و ۳۱۲؛ تجزیه، گسترشِ M−۱ وجمعِ قسمتِ همپوشان خوانده شد؛ شکلها مشاهدهشده یا بازنشرشده ادعا نمیشوند
منابع در 2026-11-04 خوانده شدند؛ این تاریخ، تاریخ انتشار منبع نیست. مثالها و فایلهای این راهنما آموزشی و ساختهٔ تحریریهاند.