Engee 文档
Notebook

科特尔尼科夫定理

Kotelnikov定理(也称为采样定理奈奎斯特–香农定理)是信号理论中的一个基本语句,它定义了从离散样本中准确重建连续信号的条件。

如果有连续信号 它具有有限的频谱(即它只包含从 以前 ​),那么它可以准确从它的采样与频率采取重建:

哪里:

  • -采样率(sampling rate),

  • ​ -信号频谱中的最大频率。

你应该注意什么:

  1. 奈奎斯特频率是可以实现精确信号恢复的最小采样频率:

    $ $F_{\text{nyquist}}=2F_{\text{max}}

    $ $s\text{(}t\text{)}=\sum_{n=-\infty}^{\infty}s\text{(}nt\text{)}\cdot\text{sinc}\left\text{(}\frac{t-nt}{t}\right\text

-计数之间的间隔,

定理基本条件的验证

让我们模拟一个"连续"信号(实际上,相同的离散信号,但具有非常密集的间隔样本,然后我们将"数字化"它:

In [ ]:
using DSP;
fs0 = 10000;                    # Завышенная частота дискртизации для отображения "аналогового" сигнала
dt0 = 1/fs0;                    # Шаг временной сетки
endtime = 0.04;                 # Конечный момент времени
t0 = 0:dt0:endtime-dt0;         # Вектор отсчётов времени (временная сетка)
Fmax = 100;                    # Основная частота синусоидального сигнала в Гц
analog = cos.(2*pi*Fmax*t0);   # Синусоидальный "непрерывный" сигнал для "оцифровки"

明显满足Kotelnikov定理条件的离散信号:

In [ ]:
fs1 = 10 * Fmax;               # Частота дискретизации сигнала, удовлетворяющая теореме Котельникова    
dt1 = 1/fs1;
t1 = 0:dt1:endtime-dt1;         
stem1 = cos.(2*pi*Fmax*t1);    # Дискретный сигнал (отсчёты непрерывного сигнала)
plot(t0, analog, linewidth=4, label="Непрерывный")
plot!(t1, stem1, line=:stem, marker=:circle, linewidth=2, label="ЧД = 1000 Гц")
Out[0]:

现在让我们创建一个满足限制情况下条件的信号():

In [ ]:
fs2 = 2 * Fmax;
dt2 = 1/fs2;
t2 = 0:dt2:endtime-dt2;
stem2 = cos.(2*pi*Fmax*t2);
plot(t0, analog, linewidth=3, label="Непрерывный")
plot!(t2, stem2, line=:stem, marker=:circle, linewidth=3, label="ЧД = 200 Гц")
Out[0]:

最后,让我们检查如果Kotelnikov定理的条件不满足,"数字化"信号是什么样子的。:

In [ ]:
fs3 = 1.5 * Fmax;
dt3 = 1/fs3;
t3 = 0:dt3:endtime-dt3;
stem3 = cos.(2*pi*Fmax*t3);
plot(t0, analog, linewidth=4, label="Непрерывный")
plot!(t3, stem3, line=:stem, marker=:circle, linewidth=3, label="ЧД = 150 Hz")
Out[0]:

让我们检查恢复信号的可能性 fs = 200 Гц. 为此,我们将不得不在离散信号的样本之间添加零,然后将其通过成形低通滤波器。:

In [ ]:
upsampled_stem2_chunk = [1; zeros(49); -1; zeros(49)];
upsampled_stem2 = repeat(upsampled_stem2_chunk, 4);
plot(t0, analog, linewidth=4, label="Непрерывный")
plot!(t0, upsampled_stem2, line=:stem, marker=:circle, linewidth=3, label="ЧД = 200 Гц, с нулями")
Out[0]:

让我们使用数字低通滤波器(DAC模型)模拟信号恢复:

In [ ]:
myfilt = digitalfilter(Lowpass(2*110/fs0), Elliptic(4, 0.01, 60));
H, w = freqresp(myfilt);
freq_vec = fs0*w/(2*pi);
plot(freq_vec, pow2db.(abs.(H))*2, linewidth=3,
     xlabel = "Частота, Гц",
     ylabel = "Амплитуда, дБ",
     title = "АЧХ фильтра нижних частот")
Out[0]:

让我们在DAC的输出端显示信号:

In [ ]:
DAC = filt(myfilt, upsampled_stem2);
plot(t0, analog, linewidth=4, label="Непрерывный")
plot!(t0, DAC * 25, linewidth=4, label="Выход ЦАП")
Out[0]:

我们已经看到,即使在观察定理条件的极端情况下,形式的恢复也是可能的。

不符合Kotelnikov定理条件的情况下的混叠

我们将具有较高基频的信号样本"叠加"到具有较低频率的信号样本上的效果可视化。 离散样本"属于"两个信号,但采样后我们只会看到一个较低频率的信号。:

In [ ]:
tvec = 0:0.01:10;
x1 = cos.(pi/5*tvec);
x2 = cos.(11*pi/5*tvec)
plot(tvec,x2, linewidth=3, label = "Исходный сигнал")

tnew = 0:10;
y1 = cos.(11*pi/5*tnew)
plot!(tnew,y1, line=:stem, marker=:circle, linewidth=3, label = "Дискретизация")
plot!(tvec,x1, linewidth=4, label = "Наложение", title = "Наложение, сигнал с частотой в 11 раз меньше")
Out[0]:

如果已经发生混叠,则使用任何后处理方法处理它是无用的。 有必要通过正确选择采样频率和使用抗混叠滤波器来防止其发生。

现在让我们用音频信号的例子来评估混叠效果。 添加用于收听音频的辅助功能:

In [ ]:
using WAV
using Base64

function audioplayer(s, fs);
    buf = IOBuffer();
    wavwrite(s, buf; Fs=fs);
    data = base64encode(unsafe_string(pointer(buf.data), buf.size));
    markup = """<audio controls="controls" {autoplay}>
                <source src="data:audio/wav;base64,$data" type="audio/wav" />
                Your browser does not support the audio element.
                </audio>"""
    display("text/html", markup);
end 

通过改变滑块的位置,您可以从符合定理条件的"区域"移动到不符合条件的区域。 在最右边的位置,在BH=3000Hz时,基频为2250Hz的信号与频率为750Hz的信号在听觉上无法区分。:

In [ ]:
var_fs = 3000 # @param {type:"slider",min:3000,max:5000,step:500}

freq1 = 750;
freq2 = 1500;
freq3 = 2250;

timevec = 0:1/var_fs:1 - 1/var_fs;

sig1 = cos.(2*pi*freq1*timevec);
sig2 = cos.(2*pi*freq2*timevec);
sig3 = cos.(2*pi*freq3*timevec);

audioplayer(sig1,var_fs)
audioplayer(sig2,var_fs)
audioplayer(sig3,var_fs)

结论

我们熟悉了Kotelnikov定理的基础知识,该定理广泛用于数字信号处理(音频,视频,电信)和模数转换器(Adc)的设计。 为了防止混叠,采样前使用抗混叠滤波器,抑制频率以上 .

顺便说一句,定理是独立发现的:

*在1927由弗拉基米尔Kotelnikov(苏联)。

1928年**由哈里奈奎斯特**(美国)。

后来由克劳德香农在1949年推广

在西方文学中,它通常被称为奈奎斯特-香农定理,但在俄语传统中,这个名字已经固定。 Kotelnikova