一个对基带信号滤波作用的仿真,是哪里出了错?
我的问题可以等效于下面一个理想实验:
假设要用1kbps的速度传输信息, 假设信息是用方波表示的, 1V表示"1", -1V表示"0"
假设接收信号收到加性白噪声的污染, 噪声为理想高斯白噪, 双边带功率谱密度为1, 平均期望为0, 带宽为500kHz
假设接收用1000k的速度对接收信号进行采样, 假设接收过程是理想同步的,
一种处理方法是: 直接将一个符号周期内的1000个采样点求和进行判决, 计算误码率
另外一种处理方法是: 对信号进行滤波, 仅留下有效带宽内的噪声, 同样的进行求和判决
直观上感觉后一种做法的误码率应该下降, 因为滤波后噪声的方差为 N0*BW, 而滤波前的噪声方差为N0*fs/2. 噪声小了应该只有好处没坏处吧?
用Matlab编程得到如下的程序
fd = 1e3; %bit rate
fs = 1000e3; %sample rate
N0 = 1; %noise level of AWGN
num = 1000; %1000位
noise = sqrt(N0*fs/2)*randn(fs/fd,num);
noiseint = sum(noise,1);
disp(sum(noiseint<-1000)); %统计求和小于-1的,也即令判决出错的次数
B = fir1(63,fd*2/fs);
noise2 = filter(B,1,noise);
noiseint2 = sum(noise2,1);
disp(sum(noiseint2<-1000));
运行的结果却是二者的误码率近乎相同, 也就是滤噪声没有任何用处.
难道滤除带外噪声这种通用的通信接收处理是没有用的?
是哪里出错了? 请不吝赐教!
谢谢!
1.从时域来看,滤波器增益是1,加不加滤波器求和之后的统计量分布是一样的,所以两者严格相等。
2.接收是匹配滤波,已经是最优的,本来就无需再滤波
希望你写的每行程序自己首先能明白啥意思,希望能从以下角度分析一下:
1、从你写的程序里看不出你想实现的东西
2、查了一下filter的用法,好像只能对向量进行滤波,对矩阵滤波不知道是啥结果
3、你可以画一下频谱图看看,滤波确实有了作用,但用了sum后就又没滤波的效果了
真不知道这些话是什么意思,真的。
不要搞1000倍过采样,小点差异比较明显
......
我啥也不说了,除了一句话:
我像你这种水平的时候一般是不敢回答别人帖子的
关于1我已经想通了
向量fft后的第一个系数就是向量sum的结果
因此进行低通滤波直流不变
可以理解滤波不改变求和后的值
只是我还是直觉上不太理解你说的2,尽管隐隐觉得是对的
可如果是这样,为什么所有的接收设备都要做带通滤波?
仅做个匹配滤波不就行了吗?
跟1000肯定是没关系的,换别的数也一样
用1000主要是为了减小滤波的群时延影响
做人还是谦虚点好,毕竟我也是来帮你找问题的
1个符号内1000个采样点求和,相当于通过了一个很窄的低通滤波器(采样中信号的部分是相关叠加,幅度是1000倍功率是1000^2倍;噪声部分是非相关叠加,功率是1000倍)。如果先通过带通再求和,信号和噪声在带内都是相关的,都是幅度变为1000倍。
1.你把sum去掉,取中间的抽样点来判决,选择合适的门限,就能得到你想要的效果。
2.从频域看,低通滤波与sinc函数滤波(sum的效果)相乘后基本还是sinc形状,所以加
不加低通是一样的
3.不是不要低通滤波,是不用两次滤波,sum本身就已经是低通滤波了。
4.匹配滤波在高斯信道下是最优的,衰落信道下未必。
clear all;
close all;
clc;
fd = 1e3; %bit rate
fs = 1000e3; %sample rate
N0 = 1; %noise level of AWGN
num = 1000; %1000位
noise = sqrt(N0*fs/2)*randn(fs/fd,num); %产生一个正态分布的噪声矩阵,行数是每符号采样,列数是符号数
noiseint = sum(noise,1);%计算每符号的能量 ,行向量,每个元素仍是正态分布,方差*1000
disp(sum(noiseint<-1000)); %统计求和小于-1的,也即令判决出错的次数
B = fir1(63,2*fd/fs);
noise2 = filter(B,1,noise);%%%对每个列向量进行滤波,每个列向量是窄带高斯噪声,仍是高斯分布,均值为0,方差不变,还是1
noiseint2 = sum(noise2,1);%%%把每列的元素相加,得到一个高斯分布的行向量,n个同分布变量的和是高斯分布,均值为0,方差为1000
disp(sum(noiseint2<--1000));
因此:
1、你的程序里面根本体现不出-1和+1两种符号值
2、你实际上最后统计的是两个均值为0,方差为1000的高斯分布变量小于-1000的结果,结果当然是接近的;
3、请你谦虚点,如果我解释有误欢迎共同交流。
你这个根本不是通信问题,就是个最简单的大学二年级数字信号处理问题,考虑一下你
的“信号”频谱是什么,你的低通滤波器的通带是多少?要是你“虑”出来的噪声还是分部在
远远大于信号的频谱范围内,误码率当然几乎不变,你现在假设信号恒为一,频谱根本就
是个狄拉克函数,低通有用才见鬼了,你把信号改成一个1一个0试试,肯定效果明显。
我假期去外地玩了一圈, 没有上网
关于这个问题我已经想的很清楚了
前面HoEnMi网友的回答是正解
你的理解是错误的
关于你的两个问题:
1. 我不设置+1, -1的符号只是假设符号为全1, 这样只统计噪声积分往一个方向(即-1)的偏差分布即可, 编程方便, 而仿真结果也不会和假设传输符号为(1, -1)的随机二进制数据有什么不同;但凡搞过点算法设计的人一看就明白我的意思
2. 滤波后的噪声方差显然已经变了,变为原来的fs/fd/2分之一,你用matlab试试即可,这也是我最开始对问题迷惑的原因:即为什么两个方差不同的噪声向量累积起来对判决的影响是一摸一样的?
我对你不满意的地方在于你看不懂别人的程序理解不了问题所在甚至连filter对矩阵的用法都不愿意自己试试却上来就用"你根本不明白自己的程序在写什么"这么不客气的话,我做通信信号处理算法设计好歹也七八年了,这点底气还有,至于你,不清楚你的资历,但对问题的理解不比本科生高明多少
其实这个问题我已经想的很清楚了,敲这么多回复就是让你明白尊敬客气这些东西都是相互的
跟信号频谱鸟关系都没有,我就假定基带数据是全1了,一点都不犯法
我提自己的问题我自己来总结下吧:
累加判决的过程相当于先通过了一个[1 1 1 1 .... 1 1 1]的滤波器后再N倍降采样
这个就是梳状滤波的概念,本来就是低通滤波的一种,因此是否加那个低通滤波器B不会对判决有影响
如果信号不是方波, 则需要与基带成型滤波器匹配的匹配滤波器才能获得判决时理论上的最大信噪比,而我这里基带信号就是方波,全1的滤波器就已经是匹配滤波了
但这并不是说带通滤波就不重要, 我假设的实验条件中有一个特殊之处: 就是假定噪声带宽正好符合奈奎斯特采样要求, 但如果这一条不满足, 即噪声带宽大于系统抽样频率的话, 就必须有带通滤波,一般通过模拟滤波来实现,这也可以用下面的仿真来证实:
fd = 1e3; %bit rate
fs = 1000e3; %sample rate
N0 = 0.001; %noise level of AWGN
num = 10000; %1000位
noise = sqrt(N0*fs/2)*randn(fs/fd,num);
noiseint = sum(noise,1);
disp(sum(noiseint<-fs/fd)); %统计求和小于-1的,也即令判决出错的次数
n = 10;
noise_sample = noise(1:n:end,:);
noise_sample_int = sum(noise_sample,1);
disp(sum(noise_sample_int<-fs/fd/n)); %直接对降采样结果进行累加判决
B = fir1(63,fd/fs*2);
noise2 = filter(B,1,noise);
noiseint2 = sum(noise2,1);
disp(sum(noiseint2<-fs/fd));
数字域的带通/低通滤波在降采样之前是有必要的,原因同上;
对同步环节重要,带通/低通滤波减少带外噪声可以增加锁相环路稳定性;
在匹配滤波器存在的前提下进行带通/低通滤波对提高BER无帮助;
汗,都是大牛,但你这口气一出,以后谁还敢回答你的问题啊,感觉你是来下战书啊。
呵呵,还是以前idiot老师比较符合楷模形象。
我是路人甲。现在不玩通信了,做生意去了。
呵呵,其实没有,板上牛人还是大把大把的,
比如最开始回答我问题的那位板油对通信本质的理解就非常深刻,句句珠玑
我也是技术荒废了很久再捡起来碰到了问题有点想不清楚, 而且比较急脾气而已
没别的意思
除了你说的这些,我想主要是你仿真时对Eb/N0(Es/N0)和SNR的理解问题。
1.对模拟信号,有Es/N0=(S*Tsym)/(N/Bn)=(S/N)*(Bn*Tsym),你的两种情况下噪声带宽Bn不同,Es/N0相同,因而接收信号SNR不同,这在你的仿真中根本没有体现。
2.数字信号的仿真时需要进行定标(calibration),这方面你可以参考matlab中关于awgn函数的help、“simulation of communication systems”这本书及网上的资料等等。
具体说来:
(1)仿真时要确定噪声方差sigma2。对模拟信号,带宽为Bn的wgn信号的sigma2为N0*Bn或N0*Bn/2(带通和复基带),而在数字信号仿真中,把sigma2定义为N0或N0/2。
(2)不失一般性,假设复基带信号是模为A的psk调制,则模拟的Es=A^2*Tsym,而在数字仿真时则是Es=m*A^2,其中m为一个符号周期内的采样点个数。
对模拟信号,Es/N0=A^2*Tsym/(2sigma2/Bn)=(A^2/2/sigma2)*Bn*Tsym,对数字信号Es/N0=m*(A^2/2/sigma2)。一般假定Bn=1/Tsamp因此Bn*Tsym=Tsym/Tsamp=m,这样,模拟中频、模拟复基带、数字信号三者的Es/N0就能保持相同。而你仿真的是Bn不同的两种情况,两者的sigma2也是不同的。
因此你的猜测是正确的,数字通信系统中,提高采样率,经过匹配滤波(通常是根升余弦滤波)后,SNR可相应提高。这是没有疑问的,但你的仿真却并未体现出这点。
这涉及到对通信仿真的方法论问题, 你的方法无疑是没有错的, 例如你说模拟的Es=A^2*Tsym,而在数字仿真时则是Es=m*A^2, 如果对数字域的知识把握的清楚是可以解决问题
但我一般仿真的时候, 数字域里关于能量,功率谱密度这些参数的计算我都习惯于以带量纲的物理量去考虑问题,也即,将实际的抽样频率fs加进去,而不是把抽样频率归一化为无量纲的1.
例如如果是我来写上面你说的这两个量:
Es一样, 是A^2*Tsym
但数字域我的Es = m*A^2/fs, 这个fs就是仿真用的抽样频率
这种方法的优点在于概念清晰, 物理图像清楚, 即用物理量的眼光去看待数字域的抽样点信号, proakis的<现代通信系统 ---使用Matlab>仿真一书中所有的仿真实验设计都是用的这种思路, 我认为比把抽样频率归一化为1这种思维更直接, 因为:
1. 可以用同一种思维方法去考虑模拟域和数字域的问题.
2. 对于处理抽样率变换后的信号特征计算更有着直接的帮助. 例如对N0的高斯白噪直接降采样10倍, 根据混叠原理我可以直接知道降采样后的噪声谱密度大了10倍, 但delta^2 = N0*fs, delta保持不变
另外数字通信系统中, 提高采样率对提高SNR是没有帮助的, 只要采样时高于fs/2的噪声已经被充分过滤即可.
匹配滤波器选择开方升余弦滤波的前提是发送信号的基带波形也是开方升余弦滤波器生成的, 我的仿真中这一条不满足, 因为我为了编程方便,基带波形是方波, 方波对应的匹配滤波就是矩形窗口, 即符号周期内直接累加.
相关文章:
- 请问有没有简单的用matlab进行波束形成仿真的程序(05-08)
- 那位高手指点一下OFDM的基本仿真,用MATLAB,谢谢了(05-08)
- 请教OPNET与NS2仿真模型(05-08)
- 求助,卷积码的软判决维特比译码的matlab仿真!(05-08)
- 请问系统级仿真与链路级仿真有什么不同,谢谢。(05-08)
- 请教Rayleigh信道仿真的参考文献(05-08)