生成具有特定方差和 SNR 的信号

信息处理 matlab 噪音 估计 信噪比 协方差
2022-01-26 04:44:44

考虑以下形式的系统模型:yn=axn+vn在哪里xn是被破坏的输入vn这是一个零均值和方差为 1 的加性高斯白噪声n=1,2,...,N样品。a是表示信道系数的未知参数。我如何生成vn这是白色的,但具有不同的方差1和特定的信噪比?

问题:我不确定以下方式是否会产生非单位方差的信号以及如何确定方差?如果我z_10使用awgn()特定 SNR 创建一个信号,比如说 10 dB,那么它的方差会与z_20使用 SNR = 20 dB 创建的另一个信号不同吗?创建特定方差的信号并了解其 SNR 的正确方法是什么? y_wnoise = y + sqrt(variance)*randn(size(y)) 但是如何包含 SNR 值?

我在MATLAB中实现的方式如下。我做对了吗?

%generate data:
N = 50; %number of data points
s = randn(1,N);
a = 0.6;
for n = 1:N
   y(n) = a*s(n); 
end
SNR = [10,15]


%generate noisy signal of different variance
z_10 = awgn(y,10,'measured');
z_15 = awgn(y,15,'measured');
OR
z1 = y + sqrt(0.6)*randn(1,N);
1个回答

这取决于您所说的信噪比是什么意思。将其拼写为“某物噪声比”是 DSP 社区中的一个常见笑话,指的是 SNR 没有唯一的定义,因此该术语本身没有任何意义。

自己定义并适当地使用它。

常见的是将其定义为SNR=PsPn在哪里s是信号样本的功率(方差)(Xn在你的符号中)和n是噪声样本的功率(方差)。

因此:

P_s = 1;   % target signal power
SNR = 15;  % target SNR in dB
P_n = P_s / 10^(SNR/10); % calculated noise power

s = randn(1,N)*sqrt(P_s);
v = randn(1,N)*sqrt(P_n);
y = a*s + v;

顺便说一下,你不需要那里的 for 循环。您可以使用该awgn功能,它应该做一些非常相似的事情。同样,虽然没有明确的需要。

请注意,此 SNR 的定义独立于a. 根据您的应用程序,这可能是可取的或不可取的。在后一种情况下,您可以将其包含在您的 SNR 定义中。随意这样做。只需非常清楚地定义一切。

*编辑:回答您的问题:SNR 实际上是信号功率与噪声功率的比率。因此,要更改 SNR,您可以同时更改两者。如果您希望 SNR 高出 10 dB,您可以将噪声方差降低 10,或者将信号方差增加 10。

如果您想在保持噪声方差固定(例如 1)的同时更改 SNR,欢迎您这样做。几乎相同的方法:

P_n = 1;   % target noise power
SNR = 15;  % target SNR in dB
P_s = P_n / 10^(-SNR/10); % calculated signal power

s = randn(1,N)*sqrt(P_s);
v = randn(1,N)*sqrt(P_n);
y = a*s + v;

这也意味着查看噪声方差本身并不能告诉您 SNR 条件。如果您假设它为 1,这可能意味着低 SNR(如果信号功率低于 1)或高 SNR(如果它远高于 1)。