چیتشیت
اعداد مختلط، تبدیل فوریه و سیگنالها
Complex Numbers, Fourier and Signals
دورانهای مختلط، DFT و FFT، پنجرهها، نمونهبرداری، اسپکتروگرامها، بانکهای فیلتر مل و MFCCها. کدهای پایتون دروس.
فهرست مطالب
الگوریتم FFT کولی-توکی، 8 نقطهای
معماریتبدیل شکلموج به اسپکتروگرام لگاریتمی مِل و MFCC
گامبهگام- فریمبندیبرش پنجرههای 25 میلیثانیهای با گام پرش 10 میلیثانیه. در 16 کیلوهرتز معادل 400 و 160 نمونه است.
- پنجرهگذاریضرب هر فریم در
hann(N). لبهها را به سمت صفر باریک میکند. - STFTمحاسبهی بزرگی FFT هر فریم. ابعاد آن
(n_frames, n_freq_bins)است. - ملضرب در بانک فیلتر مثلثی. 80 مِل در بازهی 0 تا 8 کیلوهرتز استاندارد ASR است.
- لگاریتم
log(mel_spec + 1e-10)بازه دینامیکی را فشرده میکند. - MFCCاِعمال
dct_iiروی هر فریم اسپکتروگرام لگاریتمی مِل. نگهداشتن 13 ضریب اول.
وظایف در کد
کار و کد| وظیفه | کد |
|---|---|
| دوران یک نقطه به اندازه 45 درجه | point * euler(math.pi / 4) |
| N نقطه روی دایره مثلثاتی واحد | roots_of_unity(N) |
| تبدیل و تبدیل معکوس، O(N^2) | `dft(x)`, then `idft(X)` |
| تبدیل سریع، توانی از 2 | fft(x) |
| انرژی بر حسب فرکانس | power_spectrum(X) |
| کانولوشن خطی با FFT | convolve_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 kHz | TTS مدرن |
44.1 kHz | صدای CD، موسیقی |
48 kHz | سینما، صدای حرفهای، TTS با وضوح بالا |
توابع پنجره
دستورها| دستور | کاربرد |
|---|---|
Rectangular | بدون پنجره. لبهای جانبی -13 dB. سیگنال دقیقاً با دورهی N متناوب است |
Hann | 0.5 (1 - cos(2 pi n / (N-1))). -31 dB. همهمنظوره |
Hamming | 0.54 - 0.46 cos(2 pi n / (N-1)). -42 dB. تحلیل گفتار |
Blackman | لب اصلی پهن. -58 dB. سرکوب لبهای جانبی بسیار حیاتی است |
اعداد و پیشفرضها
پیشفرضها| تنظیم | پیشفرض | توضیح |
|---|---|---|
Frame length at 16 kHz | 400 | پنجره 25 میلیثانیهای |
Hop at 16 kHz | 160 | 10 میلیثانیه. 10 ثانیه 998 فریم میدهد |
Mel bins for ASR | 80 | طبقهبندی صدا از 128 استفاده میکند |
MFCC coefficients | 13 | تشخیص کلمات کلیدی از 40 استفاده میکند |
Log-mel epsilon | 1e-10 | درون log(mel_spec + eps) |
Log-magnitude epsilon | 1e-6 | درون log(abs(X) + eps) |
1024-point FFT at 16 kHz | 15.6 Hz | 512 بینِ قابل استفاده در بازهی 0 تا 8 کیلوهرتز |
PCM exchange format | 16-bit | int16، بازهی مثبت یا منفی 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 نمایانگر انرژی کل است؛ مدلها معمولاً آن را نادیده میگیرند.