چیت‌شیت

اعداد مختلط، تبدیل فوریه و سیگنال‌ها

Complex Numbers, Fourier and Signals

دوران‌های مختلط، DFT و FFT، پنجره‌ها، نمونه‌برداری، اسپکتروگرام‌ها، بانک‌های فیلتر مل و MFCCها. کدهای پایتون دروس.

  • ۱۲ بخش
  • ۴ درس مرتبط
  • کد و دستورها عیناً از دوره‌ی اصلی
فهرست مطالب
  1. الگوریتم FFT کولی-توکی، 8 نقطه‌ای
  2. تبدیل شکل‌موج به اسپکتروگرام لگاریتمی مِل و MFCC
  3. وظایف در کد
  4. طیف‌ها در NumPy و SciPy
  5. ویژگی‌های مِل از صفر
  6. فرمول‌های کلیدی
  7. نرخ‌های نمونه‌برداری
  8. توابع پنجره
  9. اعداد و پیش‌فرض‌ها
  10. عیب‌یابی
  11. پرسش‌ها
  12. نکات

الگوریتم FFT کولی-توکی، 8 نقطه‌ای

معماری
تقسیمتقسیمترکیبtwiddlex[0..7]8 نمونهنیمه زوجx[0,2,4,6]نیمه فردx[1,3,5,7]E[0..3]FFT چهار نقطه‌ایO[0..3]FFT چهار نقطه‌ایX[0..7]E[k] +/- twiddle * O[k]

تبدیل شکل‌موج به اسپکتروگرام لگاریتمی مِل و MFCC

گام‌به‌گام
  1. فریم‌بندیبرش پنجره‌های 25 میلی‌ثانیه‌ای با گام پرش 10 میلی‌ثانیه. در 16 کیلوهرتز معادل 400 و 160 نمونه است.
  2. پنجره‌گذاریضرب هر فریم در hann(N). لبه‌ها را به سمت صفر باریک می‌کند.
  3. STFTمحاسبه‌ی بزرگی FFT هر فریم. ابعاد آن (n_frames, n_freq_bins) است.
  4. ملضرب در بانک فیلتر مثلثی. 80 مِل در بازه‌ی 0 تا 8 کیلوهرتز استاندارد ASR است.
  5. لگاریتمlog(mel_spec + 1e-10) بازه دینامیکی را فشرده می‌کند.
  6. MFCCاِعمال dct_ii روی هر فریم اسپکتروگرام لگاریتمی مِل. نگه‌داشتن 13 ضریب اول.

وظایف در کد

کار و کد
وظیفهکد
دوران یک نقطه به اندازه 45 درجهpoint * euler(math.pi / 4)
N نقطه روی دایره مثلثاتی واحدroots_of_unity(N)
تبدیل و تبدیل معکوس، O(N^2)`dft(x)`, then `idft(X)`
تبدیل سریع، توانی از 2fft(x)
انرژی بر حسب فرکانسpower_spectrum(X)
کانولوشن خطی با FFTconvolve_fft(x, h)
تقسیم سیگنال به فریم‌هاframe(signal, frame_len, hop)
ماتریس بانک فیلتر ملmel_filterbank(n_mels, n_fft, sr)

طیف‌ها در NumPy و SciPy

کد
python
waveform, sr = sf.read("clip.wav", dtype="float32")  # float32 در بازه [-1, 1]
spectrum = np.fft.fft(signal)
freqs = np.fft.fftfreq(256, d=1/256)                 # فرکانس هر بین
power = np.abs(spectrum) ** 2                        # طیف توان
window = windows.hann(256)                           # از scipy.signal
result = fftconvolve(signal, kernel, mode='full')
frequencies, times, Zxx = stft(signal, fs=sample_rate, nperseg=256)
spectrogram = np.abs(Zxx) ** 2                       # (n_frequencies, n_time_frames)
print(cmath.exp(1j * cmath.pi))                      # فرمول اویلر: نزدیک به -1

ویژگی‌های مِل از صفر

کد
python
def hz_to_mel(f):
    return 2595.0 * math.log10(1.0 + f / 700.0)
mag = stft_magnitude(signal, frame_len=400, hop=160)  # Hann + DFT به ازای هر فریم
fb = mel_filterbank(n_mels, n_fft, sr)                # 80 مِل، n_fft=400 خروجی (80, 201) می‌دهد
mel_spec = apply_filterbank(cmag, fb)                 # یک مجموع وزندار به ازای هر بین مل
lm = log_transform(mel_spec)                          # eps=1e-10
mfcc = dct_ii(lm[len(lm) // 2], 13)                   # ضریب 0 نمایانگر انرژی کل است

فرمول‌های کلیدی

مفهوم‌ها
ضرب
$(a + bi)(c + di) = (ac - bd) + (ad + bc)i$. اندازه‌ها ضرب و زاویه‌ها جمع می‌شوند.
قطبی
$r = \sqrt{a^2 + b^2}$ و $\theta = \mathop{\mathrm{atan2}}(b, a)$.
اویلر
$e^{i\theta} = \cos\theta + i \sin\theta$. ضرب در آن معادل دوران به اندازه‌ی $\theta$ است.
DFT
$X[k] = \sum_{n=0}^{N-1} x[n] \, e^{-2\pi i k n/N}$.
معکوس DFT
توان مثبت و ضریب $1/N$. بازسازی دقیق است.
بین‌ها
$f_k = k \cdot f_s / N$، تفکیک‌پذیری $f_s / N$، بیشینه $f_s / 2$.
قضیه کانولوشن
$x * h = \text{IFFT}(\text{FFT}(x) \cdot \text{FFT}(h))$.
مل
$m = 2595 \cdot \log_{10}(1 + f / 700)$.

نرخ‌های نمونه‌برداری

دستورها
دستورکاربرد
8 kHzتلفنی. نایکوئیست در 4 کیلوهرتز صامت‌ها را از بین می‌برد. برای ASR استفاده نشود
16 kHzاستاندارد ASR. یک فایل صوتی 10 ثانیه‌ای معادل 160,000 عدد اعشاری است
22.05 kHzآموزش ووکوودر TTS برای مدل‌های قدیمی‌تر
24 kHzTTS مدرن
44.1 kHzصدای CD، موسیقی
48 kHzسینما، صدای حرفه‌ای، TTS با وضوح بالا

توابع پنجره

دستورها
دستورکاربرد
Rectangularبدون پنجره. لب‌های جانبی -13 dB. سیگنال دقیقاً با دوره‌ی N متناوب است
Hann0.5 (1 - cos(2 pi n / (N-1))). -31 dB. همه‌منظوره
Hamming0.54 - 0.46 cos(2 pi n / (N-1)). -42 dB. تحلیل گفتار
Blackmanلب اصلی پهن. -58 dB. سرکوب لب‌های جانبی بسیار حیاتی است

اعداد و پیش‌فرض‌ها

پیش‌فرض‌ها
تنظیمپیش‌فرضتوضیح
Frame length at 16 kHz400پنجره 25 میلی‌ثانیه‌ای
Hop at 16 kHz16010 میلی‌ثانیه. 10 ثانیه 998 فریم می‌دهد
Mel bins for ASR80طبقه‌بندی صدا از 128 استفاده می‌کند
MFCC coefficients13تشخیص کلمات کلیدی از 40 استفاده می‌کند
Log-mel epsilon1e-10درون log(mel_spec + eps)
Log-magnitude epsilon1e-6درون log(abs(X) + eps)
1024-point FFT at 16 kHz15.6 Hz512 بینِ قابل استفاده در بازه‌ی 0 تا 8 کیلوهرتز
PCM exchange format16-bitint16، بازه‌ی مثبت یا منفی 32,767

عیب‌یابی

عیب‌یابی
  • خروجی نامفهوم و بی‌معنی مشابه باگ مدل

    علت
    عدم تطابق نرخ نمونه‌برداری
    راه‌حل
    ابتدا نرخ نمونه‌برداری را یکسان کنید. 16 kHz مونو float32
  • فرکانس 7 کیلوهرتز در 3 کیلوهرتز پیک می‌زند

    علت
    تداخل فرکانسی در بالای فرکانس نایکوئیست
    راه‌حل
    فیلتر پایین‌گذر پیش از کاهش نرخ نمونه‌برداری (downsampling)
  • فرکانس‌های بالای کاذب

    علت
    نشتی طیفی در لبه‌های فریم
    راه‌حل
    اِعمال پنجره Hann یا Hamming
  • شکست خاموش حین اینفرنس

    علت
    عدم تطابق تعداد فیلترهای مِل، 80 در برابر 128
    راه‌حل
    ابعاد ویژگی‌ها را در هر دو سمت لاگ بگیرید
  • ورودی نادرست برای Whisper

    علت
    dB-mel به جای اسپکتروگرام لگاریتمی مِل
    راه‌حل
    تزریق اسپکتروگرام لگاریتمی مِل به عنوان ورودی
  • دو برابر شدن WER در محیط عملیاتی

    علت
    دریفت نرمال‌سازی
    راه‌حل
    استفاده از نرمال‌سازی یکسان در آموزش و اینفرنس
  • طیف تخت در فریم‌های آخر

    علت
    پدینگ با صفر در انتها
    راه‌حل
    پدینگ به صورت متقارن یا تکرار لبه‌ها
  • پدیده‌ی Wrap-around در کانولوشن FFT

    علت
    تبدیل DFT کانولوشن دایروی را محاسبه می‌کند
    راه‌حل
    پدینگ با صفر تا طول N + M - 1

پرسش‌ها

پرسش و پاسخ
آیا پدینگ با صفر تفکیک‌پذیری را افزایش می‌دهد؟
خیر. تفکیک‌پذیری به داده‌هایی با طول $T = 1 / \Delta f$ ثانیه نیاز دارد.
چرا فقط N/2 + 1 بین اول نگه‌داشته می‌شوند؟
برای ورودی حقیقی، $X[N-k]$ مزدوج $X[k]$ است.
چرا ضرب در i یک دوران است؟
ضرب در i باعث چرخش 90 درجه می‌شود. دو بار چرخش معادل $i^2 = -1$ است.
RoPE چگونه از این موضوع استفاده می‌کند؟
کوئری‌ها و کلیدها را دوران می‌دهد؛ بدین ترتیب موقعیت نسبی تبدیل به زاویه می‌شود.
چرا مِل، نه هرتز؟
انسان گام صدا را در مقیاس لگاریتمی می‌شنود. تفاوت 100 تا 200 هرتز شبیه 1000 تا 2000 هرتز حس می‌شود.
قضیه پارسِوال چه می‌گوید؟
مجموع انرژی در حوزه زمان و فرکانس برابر است.

نکات

نکته‌ها
  • کار را با 80 اسپکتروگرام لگاریتمی مِل شروع کنید مگر اینکه با موسیقی کار می‌کنید.
  • طول FFT بزرگ‌تر تفکیک‌پذیری فرکانسی بهتر و تفکیک‌پذیری زمانی بدتری می‌دهد.
  • برای طول FFT از توان 2 استفاده کنید. تا توان 2 بعدی پدینگ با صفر انجام دهید.
  • اندازه‌ی N ریشه‌ی واحد برابر با 1 است و مجموع آن‌ها صفر می‌شود.
  • خروجی idft(dft(x)) را با x مقایسه کنید. باید با دقت ماشین همخوانی داشته باشد.
  • ضریب 0 در MFCC نمایانگر انرژی کل است؛ مدل‌ها معمولاً آن را نادیده می‌گیرند.