我是看出來了,大家不愛看我寫程序,還是喜歡信號鏈,那就大晚上的寫一個(gè)小 Tips:
在對企業(yè)做技術(shù)支持的時(shí)候,頻繁的會(huì)遇到小信號被淹沒的情況好問題,我這里手頭就拿一個(gè) LHA7668 的手冊說一下:
這類 ADC 都會(huì)帶一個(gè)工頻的數(shù)字濾波器那我問你,為什么 Σ-Δ ADC(SD-ADC)里 sinc3 濾波器常用于 50/60 Hz 抑制 ?
Σ-Δ ADC 的工作原理回顧
前端調(diào)制器輸出的是 高頻過采樣比特流(帶寬遠(yuǎn)大于信號)。
后端數(shù)字濾波器必須完成兩件事:
- 抽取 (Decimation) → 把高速比特流降采樣到目標(biāo)采樣率 (ODR)。
常見濾波器結(jié)構(gòu)是 sincN 濾波器,其中 N 是階數(shù)。
sinc3 的頻率響應(yīng)特性
sincN 濾波器本質(zhì)是:
它在 抽取頻率的整數(shù)倍 上會(huì)產(chǎn)生 **深陷零點(diǎn) (notch)**。
對 sinc3 來說,每個(gè)整數(shù)倍的抽取頻率 位置都有一個(gè)陡峭零點(diǎn)。
為什么正好能抑制 50/60 Hz
電網(wǎng)干擾通常集中在 50 Hz 或 60 Hz 及其諧波。
只要把 輸出數(shù)據(jù)率 (ODR) 配置得合適,讓 sinc3 的零點(diǎn)頻率 恰好落在 50 Hz / 60 Hz,就能自動(dòng)形成深陷波。
舉個(gè)例子:
如果 ODR = 400 Hz,那么 sinc3 的零點(diǎn)會(huì)出現(xiàn)在 400 Hz、800 Hz、1200 Hz...;通過調(diào)節(jié) ODR,可以讓零點(diǎn)精確對齊 50 Hz 或 60 Hz。
AD7768-1 數(shù)據(jù)手冊里就特別強(qiáng)調(diào):
sinc3 模式可以選取合適的抽取比,使得濾波器零點(diǎn)正好對準(zhǔn) 50/60 Hz 工頻干擾,從而大幅抑制電源噪聲。
為什么選 sinc3(而不是 sinc5 / FIR)
sinc5 雖然也有零點(diǎn),但延遲更長,資源消耗更大,不一定正好對齊 50/60 Hz。
FIR 濾波器雖然通帶極平坦,但沒有周期性的陷波特性,抑制工頻干擾必須另加陷波器。
sinc3 在階數(shù)和延遲上折中,同時(shí)天然提供周期性陷波,實(shí)現(xiàn) 50/60 Hz 抑制最直接。
sinc3 濾波器的零點(diǎn)與抽取率直接相關(guān) → 可以“對齊” 50/60 Hz。
工頻抑制 是工業(yè)和電力測量里最常見的需求(電流、電壓、功率計(jì)、傳感器);因此,SD-ADC 廠商普遍推薦 sinc3 模式用于工頻環(huán)境的抗干擾。


—— 配置舉例 ——
f_mod = 256.0 kHz
50 Hz 抑制: R ≈ 5120, ODR ≈ 50.000 S/s, comb零點(diǎn)在 50, 100, 150, ... Hz
60 Hz 抑制: R ≈ 4267, ODR ≈ 59.995 S/s, comb零點(diǎn)在 60, 120, 180, ... Hz
選擇抽取比 R ≈ fs_mod / 50(例:fs_mod=256 kHz → R=5120,ODR≈50 S/s),sinc3 的第一個(gè)零點(diǎn)落在 50 Hz;選擇 R ≈ fs_mod / 60(R=4267,ODR≈60 S/s),零點(diǎn)落在 60 Hz。
因?yàn)?comb/sinc3 的零點(diǎn)還會(huì)出現(xiàn)在其整數(shù)倍(100、150、… 或 120、180、…),所以工頻及其諧波一起被深度抑制,這就是它特別適合電網(wǎng)環(huán)境測量的原因。
# 用 comb(=sinc^N) 數(shù)字抽取濾波器的幅頻響應(yīng),演示如何通過設(shè)置抽取比 R(= decimation ratio)
# 讓零點(diǎn)(notches)精確對齊 50 Hz 或 60 Hz。
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'Heiti TC' # 替換為你選擇的字體
def comb_mag_db(f, fs_mod, R, N=3):
"""
級聯(lián)積分梳狀(CIC)/sinc^N 濾波器的幅頻響應(yīng)(單位 dB)
H(ω) = [ sin(π f R / fs) / sin(π f / fs) ]^N
這里 fs = fs_mod(調(diào)制器輸出采樣率,即SD-ADC比特流速率)
"""
x_num = np.sin(np.pi * f * R / fs_mod)
x_den = np.sin(np.pi * f / fs_mod)
# 避免 0/0
x_den = np.where(np.abs(x_den) < 1e-15, 1e-15, x_den)
H = np.abs(x_num / x_den) ** N
H_db = 20*np.log10(H + 1e-20)
return H_db
# 設(shè)定一個(gè)典型調(diào)制器頻率(示例值,不同器件不同;只為演示)
fs_mod = 256_000.0 # 256 kHz 調(diào)制器輸出(比特流/內(nèi)部高速率)
# 情況 A:對齊 50 Hz
# 選擇 R 使得 comb 的第一個(gè)零點(diǎn)落在 50 Hz,即 fs_mod / R = 50 -> R = fs_mod / 50
R_50 = int(round(fs_mod / 50.0))
# 輸出數(shù)據(jù)率 ODR_A = fs_mod / R_50 約等于 50 S/s
ODR_A = fs_mod / R_50
# 情況 B:對齊 60 Hz
R_60 = int(round(fs_mod / 60.0))
ODR_B = fs_mod / R_60
# 頻率軸:只看 0~500 Hz 的工頻范圍(更清楚)
f = np.linspace(0.01, 500.0, 5000)
H50_db = comb_mag_db(f, fs_mod, R_50, N=3)
H60_db = comb_mag_db(f, fs_mod, R_60, N=3)
# 圖1:R 選擇用于 50 Hz 抑制
plt.figure()
plt.plot(f, H50_db)
plt.axvline(50.0, linestyle='--')
plt.title(f"sinc^3 抽取響應(yīng)(R≈{R_50}, ODR≈{ODR_A:.2f} S/s):50 Hz 處出現(xiàn)深陷")
plt.xlabel("Frequency (Hz)")
plt.ylabel("Magnitude (dB)")
plt.ylim([-140, 5])
plt.xlim([0, 500])
plt.grid(True)
plt.show()
# 圖2:R 選擇用于 60 Hz 抑制
plt.figure()
plt.plot(f, H60_db)
plt.axvline(60.0, linestyle='--')
plt.title(f"sinc^3 抽取響應(yīng)(R≈{R_60}, ODR≈{ODR_B:.2f} S/s):60 Hz 處出現(xiàn)深陷")
plt.xlabel("Frequency (Hz)")
plt.ylabel("Magnitude (dB)")
plt.ylim([-140, 5])
plt.xlim([0, 500])
plt.grid(True)
plt.show()
# 同時(shí)打印關(guān)鍵配置,方便你在ADC里對照設(shè)置(注意:實(shí)際器件的 f_mod、可用抽取比是離散集合,要以數(shù)據(jù)手冊為準(zhǔn))
print("—— 配置舉例 ——")
print(f"f_mod = {fs_mod/1000:.1f} kHz")
print(f"50 Hz 抑制: R ≈ {R_50}, ODR ≈ {ODR_A:.3f} S/s, comb零點(diǎn)在 50, 100, 150, ... Hz")
print(f"60 Hz 抑制: R ≈ {R_60}, ODR ≈ {ODR_B:.3f} S/s, comb零點(diǎn)在 60, 120, 180, ... Hz")