LTE中采用OFDM调制方法,其中的一个指标为30MHz的采样率,其中有效信息带宽为18MHz。下面从这个案例出发研究信噪比之间的关系。
首先,明确几个符号的意义 :
S:信号的平均功率 N: 噪声的平均功率。
Eb: 每bit信号能量 N0:噪声的功率谱密度。
Es:信号(符号)的能量 Rb:传信率(每秒传输的bit数)
W: 信号带宽 T: 符号周期。
Ts: 采样点间隔 k: 每个符号包含的bit数。
因此,有如下公式:
E b N o = S N R − 10 l g ( R b / W ) = S N R − 10 l g ( f s ∗ M ∗ C o d e R a t e / W ) = S N R − 10 l g ( 30.72 / 18 ∗ M ∗ C o d e R a t e ) = S N R − 10 l g ( 30.72 / 18 ∗ k ) EbNo=SNR-10lg(Rb/W)= SNR-10lg(fs*M*CodeRate/W)=SNR-10lg(30.72/18*M*CodeRate) = SNR-10lg(30.72/18 * k)
EbNo=SNR−10lg(Rb/W)=SNR−10lg(fs∗M∗CodeRate/W)=SNR−10lg(30.72/18∗M∗CodeRate)=SNR−10lg(30.72/18∗k)
E s N o = S N R − 10 l g ( 1 / T ∗ W ) = S N R − 10 l g ( 30.72 ∗ N s / W ) EsNo=SNR-10lg(1/T*W)= SNR-10lg(30.72*Ns/W)
EsNo=SNR−10lg(1/T∗W)=SNR−10lg(30.72∗Ns/W)
R b = f s ∗ M ∗ c o d e r a t e = 30.72 ∗ M ∗ c o d e r a t e = 30.72 ∗ k Rb = fs*M*coderate = 30.72*M*coderate = 30.72*k。
Rb=fs∗M∗coderate=30.72∗M∗coderate=30.72∗k。
W = 18 M H z W = 18MHz。
W=18MHz
T = 1 / f s = 1 / 30.72 M H z T = 1/fs = 1/30.72MHz。
T=1/fs=1/30.72MHz。
k = M ∗ C o d e R a t e k = M*CodeRate。
k=M∗CodeRate
同时,这些公式说明了无论对于单载波或者是OFDM多载波调制,其结论和计算方法都是一样的。
2 DFT-S-OFDM波形的噪声。
关于DFT-S-OFDM波形,与上面保持同样的结论。
这里主要讨论的是不同的用户需要的信噪比都是一样的吗?
3 加噪方式讨论
3.1 wgn函数与awgn函数两者的区别。
1)normal
首先得明确EsN0和EbN0的区别,两者转换如下:2。
E s N 0 = E b N 0 + 10 ∗ l o g 10 ( M ∗ C o d e R a t e ) EsN0 = EbN0 + 10*log10(M*CodeRate)。
EsN0=EbN0+10∗log10(M∗CodeRate)。
对应下面代码可以得知两者的关系。
S N R = E s N 0 − 10 ∗ l o g 10 ( i n s v a l u e ) SNR = EsN0 - 10*log10(ins_value)。
SNR=EsN0−10∗log10(ins 。
alue)
在matlab函数中,对于加噪函数,awgn函数中加的是SNR值,在wgn函数中加的是EsN0。换句话说,awgn会计算信号的能量,wgn只是对于功率为1的信号对应信噪比的噪声进行直接叠加。
下面代码对比了两种加噪方式的区别,最终的SNR为4dB,EsNo为10dB。
clear
EsN0 = 10;
ins_value = 4;
[psf,den] = rcosine(1,ins_value,'fir/sqrt',0.35,6);。
list = 0:pi/1000000:6*pi;。
X = sqrt(2)*sin(list); %产生正弦信号。
X_upsample = upsample(X,ins_value);。
txSig = conv(X_upsample,psf);。
SNR = EsN0 - 10*log10(ins_value);。
% Y_temp = awgn(txSig,SNR,'measured'); %加入信噪比为10db的噪声,加入前预估信号的功率(强度)
Y_temp= txSig + wgn(1,length(txSig),-EsN0,'complex');。
Y = Y_temp(49:end-48);。
% 计算信噪比(下采样前计算信噪比)
% 因为是在滤波成型之后才加噪所以评估这个合理。
sigPower = sum(abs(txSig).^2)/length(txSig); %求出信号功率。
noisePower=sum(abs(Y_temp-txSig).^2)/length(Y_temp-txSig); %求出噪声功率。
SNR=10*log10(sigPower/noisePower) %由信噪比定义求出信噪比,单位为dB。
% 隔取ins_value选取再计算信噪比也是一样的。
Y_temp = Y_temp(1:4:end);。
txSig = txSig(1:4:end);。
sigPower = sum(abs(txSig).^2)/length(txSig); %求出信号功率。
noisePower=sum(abs(Y_temp-txSig).^2)/length(Y_temp-txSig); %求出噪声功率。
SNR=10*log10(sigPower/noisePower) 。
或者有以下简短的代码:
X = sqrt(2)*sin(0:pi/1000000:6*pi); %产生正弦信号,功率为1。
% Y = awgn(X,10,'measured'); %加入信噪比为10db的噪声,加入前预估信号的功率(强度)
Y = X + wgn(1,length(X), -10);。
std_noise = std(wgn(1,length(X), - 10))^2。
sigPower = sum(abs(X).^2)/length(X) ; %求出信号功率。
noisePower = sum(abs(Y-X).^2)/length(Y-X); %求出噪声功率。
SNR = 10*log10(sigPower/noisePower) %由信噪比定义求出信噪比,单位为db。
由此可见,计算信噪比的方式为SNR=10*log10(sigPower/noisePower)。
2)matlab的官方文档3
EsN0 ( d B ) = E b N 0 ( d B ) + 10 log 10 ( K ) \operatorname{EsN0}(d B)=E b N 0(d B)+10 \log _{10}(K)。
EsN0(dB)=EbN0(dB)+10log 。
10
(K)
3.2 EbN0和SNR两者的关系。
EsN0与SNR的关系如下
E s N 0 = S ∗ T / ( N / B ) = S / N ∗ T s y m b o l ∗ B EsN0 = S*T/(N/B) = S/N *T_{symbol} *B。
EsN0=S∗T/(N/B)=S/N∗T 。
symbol
∗B
下面讨论仿真中的一些想法:
在实际的信号传输过程中,讨论的是信噪比SNR。如果不进行滤波成型,那么两者一致,但是在实际的通信系统中,考虑无ISI准则一级硬件实现的代价,往往发送端需要成型滤波,在接收端需要进行成型滤波最大化接受信号的信噪比,这就需要过采样。实际上这个过程增大了信号的EsN0,提升了性能。
比较容易理解的是,在相同的SNR之下,如果信号被过采样,则等效于EbN0更高,EsN0也更高。
同时需要注意在成型滤波时产生的能量损失,损失sqrt(insvalue)。(insvalue代表采样倍数)
3.3 成型滤波与匹配滤波器对噪声的影响。
下面讨论仿真中的一些想法:
同样需要特别注意的是成型滤波和匹配滤波给信噪比带来的影响。上面说成型滤波和上采样提升了EsN0,最后SNR和EsN0呈现上述关系。但是匹配滤波之后同样会改变信噪比。
如果是使用滤波前后的信号计算信噪比,那么无疑是不对的,因为滤波会改变频谱自然会对信号产生影响,最终变成什么样也是不好预测的。
SNR是显性的,代表着真实的信道环境,而估计出来的EsN0是真实的每个符号所对应的信噪比。
4 EbNo与SNR之间的关系4。
4.1 两个问题
Q1:为什么要将EbN0转换为SNR呢?
A1:因为在实际仿真中要给信号加上高斯白噪声,而高斯白噪声的参数是与SNR直接相关的,即根据SNR变量,可以直观的给信号加上高斯白噪声,所以要将EbN0转换为SNR。一般而言,模拟系统常采用SNRBER来衡量通信系统性能,而对于数字通信系统,常采用EbN0BER来衡量通信系统的性能。
Q2:为什么仿真要用EbN0,而不用SNR呢?
A2:因为用EbN0可以直观的看到系统性能,EbN0是一个归一化的参量,由于在系统传输中会采用不同的调制技术,这样这不同进制的调制技术下频谱效率会不同,一个由k个比特映射生成的调制符号所实现的频谱效率就为k bit/s/Hz,这种情况下,在计算比特误码率的时候考虑的是整体的性能,如果横向的比较系统的性能,就要将系统效率的作用排除,此时就可以从单个比特着手去比较,EbN0可以排除频谱效率引起的问题。
4.2 示例分析
假如用户的数据传送速率为1kb/s,信道编码采用编码速率为1/3的卷积编码,每秒在这些编码数据前添加200bit的训练序列,星座映射采用QPSK调制方式,基带脉冲成型采用因子为alpha等于0.25的升余弦函数,上采样倍数为10。
首先来看一下经过各模块后数据速率的变化,原始信息速率为1kb/s,1/3卷积编码后变为3kb/s,也就是每秒传送3000bit数据,添加200bit的训练序列后,变为每秒传3200bit,此时数据速率变为3.2kb/s,采用QPSK调制后,速率变为1.6k symbol/s。
应用上述EbN0与SNR的转换公式,我们可得:
SNR=EbN0·(1/3)·(3000/3200)·log2(4)·(1/10)·(1/(1+0.25))。
用dB表示,就是:
SNR(dB)=EbN0(dB)+10·log10(1/3)+10·log10(3000/3200) +10·log10(2)+10·log10(1/10)+10·log10(1/(1+0.25))。
以上的公式中,1/3是卷积码引入的,3000/3200是因为添加了训练序列这个额外的开销而引入的,2是QPSK引入的,1/10是基带成型滤波前上采样引入的,1/(1+0.25)是基带脉冲成型滤波的升余弦函数因子引入的。
一般很容易忘记考虑训练序列或者保护间隔,一般影响不大,本例中10·log(3000/3200)接近0,但其他各项影响都很大,如果仿真结果性能超好,应该看看是否忘记哪项了。如果系统还进行了扩频,比如添加训练序列后进行了16倍扩频,那么还要考虑扩频增益带来的影响,此时,在转化为SNR时,EbN0应该还要加上10·log(1/16)。
https://blog.csdn.net/chenxingp123/article/details/24238509 ↩︎。
https://blog.csdn.net/chenshiming1995/article/details/105465014 ↩︎。
SNR、EbN0、EsN0的关系以及matlab仿真时添加AWGN噪声 ↩︎。
张少侃 EbN0与SNR转化新解 ↩︎。
点击阅读全文
打开CSDN,阅读体验更佳
Matlab信号添加噪声及信噪比SNR的计算_这是啥?的博客。
在MATLAB中可以用randn产生均值为0方差为1的正态分布白噪声,但在任意长度下x=randn(1,N),x不一定是均值为0方差为1(有些小小的偏差),这样对后续的计算会产生影响。在这里提供3个函数用于按一定的信噪比把噪声叠加到信号上去,同时可...。
MATLAB中白噪声的WGN和AWGN函数的使用以及信噪比的计算。
信噪比的计量单位是dB,其计算方法是10lg(PS/PN),其中Ps和Pn分别代表信号和噪声的有效功率,也可以换算成电压幅值的比率关系:20Lg(VS/VN),Vs和Vn分别代表信号和噪声电压的“有效值”。在音频放大器中,我们希望的是该放大器除了放大...。
使用 Java 操作 Kubernetes API。
目录 本文目标 k8s-client-java选型 kubernetes-client/java和fabric8io/kubernetes-client对比 kubernetes-client/java的使用 REST API kubectl api-versions REST API 实例: API Object 整体划分图 (红星符号代表常用资源) kubernetes-client/java客户端API接口识别 ApiClient初始化&认证 CRD资源增删改查 操作示例 Namespaces增删改查 Node增删改查 Pod增删改查 优先级 Services增删改查 操作示例。
热门推荐 Matlab信号添加噪声及信噪比SNR的计算。
一、MATLAB中自带的高斯白噪声的两个函数 MATLAB中产生高斯白噪声非常方便,可以直接应用两个函数,一个是WGN,另一个是AWGN。WGN用于产生高斯白噪声,AWGN则用于在某一信号中加入高斯白噪声。 1. WGN:产生高斯白噪声 y = wgn(m,n,p) 产生一个m行n列的高斯白噪声的矩阵,p以dBW为单位指定输出噪声的强度。 y = wgn(m,n,p,imp。
继续访问
matlab中根据信号和信噪比添加高斯白噪声(函数直接使用)_妈妈说我有...。
function[y,noise]=Gnoisegen(x,snr)%Gnoisegen函数是叠加高斯白噪声到语音信号x中%[y,noise]=Gnoisegen(x,snr)%x是语音信号,snr是设置的信噪比,单位为dB%y是叠加高斯白噪声后的带噪语音,noise是被叠加的噪声 noise=randn(size(x...。
matlab如何写程序算信噪比,Matlab中如何计算信噪比?_暗香ly的博客-CSDN...。
%Matlab计算信噪比,程序如下 function snr=SNR(I,In) % 计算信号噪声比函数 % by Qulei % I :original signal % In:noisy signal(ie. original signal + noise signal) % snr=10*log10(sigma2(I2)/sigma2(I2-I1)) ...。
matlab一为高斯噪声加入信噪比,【matlab】Matlab信号添加噪声及信噪比SNR的计算。
转载自:http://blog.csdn.net/han____shuai/article/details/51087383一、MATLAB中自带的高斯白噪声的两个函数MATLAB中产生高斯白噪声非常方便,可以直接应用两个函数,一个是WGN,另一个是AWGN。WGN用于产生高斯白噪声,AWGN则用于在某一信号中加入高斯白噪声。1. WGN:产生高斯白噪声y = wgn(m,n,p) 产生一个m行n...。
继续访问
最新发布 【数字信号去噪】基于matlab小波阙值数字信号去噪和求信噪比【含Matlab源码 2191期】
电能质量扰动信号的噪声大多以高斯白噪声的形式存在,利用小波变换对信号进行多分辨率分解,由于小波变换具有去除数据相关性的特点,故可以将有用信号与噪声的能量分离开来。信号中有效的信息主要集中在较大的小波系数上,而噪声大多分布在较小的系数中,因此通过设置阈值可以将低于该阈值的系数当做噪声去除从而达到滤波的目的。假设一个线性非平稳并含噪的一维信号表达式如下:其中,f(t)为原始信号,ε(t)为高斯白噪声,x(t)为含噪信号。
继续访问
matlab 求信噪比_热爱生活的小润的博客_matlab信噪比函数。
matlab 求信噪比 clear all;clc; % 实信号求信噪比 % X= sqrt(2)*sin(0:pi/1000000:6*pi); %产生正弦信号 % Y = awgn(X,14,'measured'); %加入信噪比为10db的噪声,加入前预估信号的功率(强度) % sigPower = sum(abs(...。
matlab中的信噪比_zzsfqiuyigui的博客_matlab 信噪比计算。
matlab中的信噪比 http://blog.sina.com.cn/s/blog_758ebadc0100qchy.html 以高斯噪声为例:若有用信号s(n)的最大幅度am,要求得到的信噪比为p,则p=10log10[(am^2)/b^2],用这个公式反推出高斯噪声的方差b^2,若s(n)单...。
【Matlab代码】图像去噪评价指标-峰值信噪比-均方根误差、归一化相关性。
【Matlab代码】图像去噪评价指标-峰值信噪比-均方根误差、归一化相关性。
继续访问
基于fabric8io的kubernetes Java 依赖包。
基于fabric8io的kubernetes Java 依赖包,jar包列表: fabric-utils-2.0.47.jar httpclient-4.5.3.jar kubernetes-client-3.0.3.jar kubernetes-model-2.0.8.jar log4j-1.2.15.jar log4j-over-slf4j-1.7.25.jar slf4j-api-1.5.6.jar slf4j-jdk14-1.5.6.jar。
怎么在matlab中看滤波后的信噪比,为什么滤波之后信噪比反而降了?新手求大神指教...。
本帖最后由 ppptt 于 2015-4-22 19:45 编辑求大神指教,对音频信号先进行加噪处理然后求信噪比是3.3967,然后进行形态滤波,再求信噪比不知道哪里出了问题,变成了3.1410,反而降了,调试了很久都不知道哪里出了错:'( ,是毕设的代码,所以有点着急,新手求大神指教,感激不尽~:)[y,fs,bits]=wavread('C:\Users\Administrator\Deskt...。
继续访问
匹配滤波&最大信噪比
匹配滤波 信号与系统
继续访问
【滤波专题-第4篇】滤波器滤波效果的评价指标(信噪比SNR、均方误差MSE、波形相似参数NCC)
之前两篇文章讲了滤波算法的两大最基本理论和。本篇将讲一下滤波效果的评价指标与用法。评价指标主要用于对滤波效果的量化评价,在论文里经常会用到。
继续访问
给信号添加指定信噪比的带限白噪声。
信号处理基础练习内容 1、生成确定信号:中心频率为800Hz的正弦信号和带宽为1KHz的线性调频信号,采样频率为40KHz。 2、生成随机信号:生成带限白噪声,频率范围为500-20KHz范围。 3、调整噪声,生成谱级信噪比分别为10dB,0dB,-10dB的信号与噪声叠加。 基础知识 信噪比(Signal Noise Rate(SNR))是通信系统或电路中某点上信号平均功率与噪声平均功率之比,该比值一般用分贝表示,信噪比越高表示噪声所占比重越小,信号质量越好。 信噪比的计算方法如下: 其中Ps和Pn分。
继续访问
关于信噪比与向已知信号添加噪声zz。
说起“向已知信号添加噪声”,有一个帖子不得不提,那是由happy教授介绍的两个常用函数,我这里引用一下: %=============================happy=================================% MATLAB中产生高斯白噪声非。
继续访问
MATLAB给灰度图像添加指定信噪比(SNR)的噪声。
首先特别指出,本博客思路参考:如何在信号中添加指定信噪比的高斯白噪声,为何深度学习去噪研究采用高斯白噪声?,特此感谢! 根据信噪比的定义,SNR是信号功率与噪声功率比值的对数,即: 信号功率,利用方差可以事先计算出来,结合给定的SNR,可以求出噪声的功率。然后生成标准高斯噪声序列,再转换为我们所需要的噪声,具体代码如下所示: %给灰度图像添加指定信噪比的噪声 %先计算信号的功率,再获得噪声的...。
继续访问
MATLAB中如何对原始信号添加不同信噪比的高斯白噪声。
****## 标题MATLAB中如何对原始信号添加不同信噪比的高斯白噪声 1.高斯白噪声 白噪声:功率谱密度服从均匀分布; 高斯:噪声的幅度分布服从高斯分布; 定义一:如果一个噪声,它的瞬时值服从高斯分布,而它的功率谱密度又是均匀分布的,则称它为高斯白噪声。 定义二:在一般的通信系统的工作频率范围内,热噪声的频谱是均匀分布的,类似白光的频谱在可见光的频谱范围内均匀分布,所以热噪声又常称为白噪声。由于热噪声是由大量自由电子的运动产生的,其统计特性服从高斯分布,故常将热噪声称为高斯白噪声。 2.信噪比 SNR:
继续访问
使用awgn加入噪声
X = sqrt(2)*sqrt(3)sin(0:pi/1000000:6pi); %产生正弦信号 Y = awgn(X,10,‘measured’); %加入信噪比为10db的噪声,加入前预估信号的功率(强度) sigPower = sum(abs(X).^2)/length(X) %求出信号功率 ...。
继续访问
估计信噪比 matlab,matlab信噪比估计程序。
以下程序运行平台:Matlab R2015a(8.5.0.197613) 一、 周期图法谱估计程序 1、 源程序 Fs=100000; %采样频率 100kHz N=1024; %数据长度 N=1024 n=0:N-......Matlab 信号处理工具箱 谱估计专题 频谱分析 Spectral estimation(谱估计)的目标是基于一个有限的数据集合描述一个信号的功率(在 频率上的)分布。功...。
继续访问
matlab中对一个信号加指定信噪比的噪声。
dt = 0.001; % T = 1; %仿真时间 t = 0:dt:T; %时间向量 x = sin(10*2*pi*t); subplot(2,1,1); plot(t, x) y = awgn(x,-5,'measured'); subplot(2,1,2); plot(t, y) awgn()函数可以对指定信号加一定信噪比的噪声。
继续访问
ADC/DAC信噪比计算(单音/宽带信号)
转换器理论信噪比 理想转换器对信号进行数字化时,最大误差为±1/2LSB,量化噪声近似于高斯分布,几乎均匀地分布于从DC至fs/2的奈奎斯特带宽。其量化误差可以通过一个峰峰值幅度为q(一个LSB的权重)的非相关锯齿波形来近似计算。现理论信噪比可以通过满量程输入正弦波计算,可以估计得到均方根量化噪声如下: 因此,输入信号的均方根值为: 因此,只考虑ADC量化噪声,理想N位转换器的均方根信噪比为: 这就是信噪比SNR = 6.02N + 1.76dB的来源,考虑DC~FS/2带宽范围,并且有效位数增加1信。
继续访问
信噪比
1.http://well3216.blog.sohu.com/96624202.html 看到很多朋友都在谈论信噪比这个概念,正好前段时间学到了这个,特此拿出来班门弄斧一下。 信噪比--SNR(有时写成S/N)是signal-to-noise ratio的缩写,是指有用信号(规定输入电压下的输出信号电压)和噪声信号(输入电压切断时,输出所残留之杂音电压)之间的比值。
继续访问
关于模拟信号的信噪比分析总结(待完善)
背景是做一个阻抗脉搏波的项目,大致原理为用高精度的ADC采集人体的阻抗信号,分析阻抗信号的变化和信号特征,从而得到人体的一些参数。例如: 在此信号情形下,想要获取和分析信号的细节,就要对信噪比提出了一个比较高的要求。否则白噪声或者系统噪声就会将一些信号细节淹没,从而影响结果参数的准确性,重复性,一致性等。 因此本文主要是针对信号做信噪比的处理分析。目的是将...。
继续访问
matlab 产生已知功率的复高斯白噪声及信噪比计算。
假定已知噪声功率PnP_nPn,那么产生一个长度为NNN的复高斯白噪声代码为: n=sqrt(0.5∗Pn)∗(randn(1,N)+1jrandn(1,N)) n=sqrt(0.5*P_n) * (randn(1,N)+1jrandn(1,N)) n=sqrt(0.5∗Pn)∗(randn(1,N)+1jrandn(1,N)) 可以通过计算信号总能量除以信号长度验证该噪声的功率是否为PnP_nPn,即 Pn=n∗n′/NP_n=n*n'/NPn=n∗n′/N ...。
继续访问
已知信噪比怎么求噪声matlab。
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。
Node与javaScript的区别在于,javaScript的顶层对象是window,而node是global。
//这里使用的var声明的变量不是全局的,是当前模块下的,用global声明的表示是全局的。
var s = 100;
global.s = 200;。
//这里访问到的s是var生命的。
console.log(s); //100。
//这里访问到的才是全局变量
console.log(global.s); //200。
模块:在node中,文件和模块是一一对应的,也就是一个文件就是一个模块;每个模块都有自己的作用域,我们通过var申明的变量并非全局而是该模块作用域下的。
(2)module模块
1、文件查找
1)首先按照加载的模块的文件名称进行查找,如果没有找到,则会带上 .js、.json 或 .node 拓展名在加载。
2)以 '/' 为前缀的模块是文件的绝对路径。 例如,require('/home/marco/foo.js') 会加载 /home/marco/foo.js 文件。
3)以 './' 为前缀的模块是相对于调用 require() 的文件的。 也就是说,circle.js 必须和 foo.js 在同一目录下以便于 require('./circle') 找到它。
4)当没有以 '/'、'./' 或 '../' 开头来表示文件时,这个模块必须是一个核心模块或加载自 node_modules 目录。
5)如果给定的路径不存在,则 require() 会抛出一个 code 属性为 'MODULE_NOT_FOUND' 的 Error。
2、module 作用域
在一个模块中通过var定义的变量,其作用域范围是当前模块,外部不能够直接的访问,如果我们想一个模块能够访问另外一个模块中定义的变量,可以有一下两种方式:
1)把变量作为global对象的一个属性,但这样的做法是不推荐的。
2)使用模块对象 module。module保存提供和当前模块有关的一些信息。
在这个module对象中有一个子对象exports对象,我们可以通过这个对象把一个模块中的局部变量对象进行提供访问。
//这个方法的返回值,其实就是被加载模块中的module.exports。
require('./02.js');。
3、__dirname:当前模块的目录名。
例子,在 /Users/mjr 目录下运行 node example.js:
console.log(__dirname);。
// 输出: /Users/mjr。
console.log(path.dirname(__filename));。
// 输出: /Users/mjr。
4、__filename:当前模块的文件名(处理后的绝对路径)。当前模块的目录名可以使用 __dirname 获取。
在 /Users/mjr 目录下运行 node example.js:
console.log(__filename);。
// 输出: /Users/mjr/example.js。
console.log(__dirname);。
// 输出: /Users/mjr。
(3)process(进程)
process 对象是一个全局变量,提供 Node.js 进程的有关信息以及控制进程。 因为是全局变量,所以无需使用 require()。
1、process.argv
返回进程启动时的命令行参数。第一个元素是process.execPath。第二个元素是当前执行的JavaScript文件的路径。剩余的元素都是额外的命令行参数。
console.log(process.argv);。
打印结果:
2、process.execPath返回启动进程的可执行文件的绝对路径。
3、process.env 返回用户的环境信息。
在process.env中可以新增属性:
process.env.foo = 'bar';。
console.log(process.env.foo);。
可以通过delete删除属性:
delete process.env.foo;。
console.log(process.env);。
在Windows上,环境变量不区分大小写。
4、process.pid 属性返回进程的PID。
5、process.platform属性返回字符串,标识Node.js进程运行其上的操作系统平台。
6、process.title 属性用于获取或设置当前进程在 ps 命令中显示的进程名字。
7、process.uptime() 方法返回当前 Node.js 进程运行时间秒长。
注意: 该返回值包含秒的分数。 使用 Math.floor() 来得到整秒钟。
8、process.versions属性返回一个对象,此对象列出了Node.js和其依赖的版本信息。
process.versions.modules表明了当前ABI版本,此版本会随着一个C++API变化而增加。 Node.js会拒绝加载模块,如果这些模块使用一个不同ABI版本的模块进行编译。
9、process对象-输入输出流。
var a;
var b;
process.stdout.write('请输入a的值: ');。
process.stdin.on('data', (chunk) => {。
if (!a) {
a = Number(chunk);。
process.stdout.write('请输入b的值:');。
}else{
b = Number(chunk);。
process.stdout.write('a+b的值:'+(a+b));。
process.exit();。
}
});
(4)Buffer缓冲器
Buffer类,一个用于更好的操作二进制数据的类,我们在操作文件或者网络数据的时候,其实操作的就是二进制数据流,Node为我们提供了一个更加方便的去操作这种数据流的类Buffer,他是一个全局的类。
1、如何创建使用buffer
Buffer.from(array) 返回一个 Buffer,包含传入的字节数组的拷贝。
Buffer.from(arrayBuffer[, byteOffset [, length]]) 返回一个 Buffer,与传入的 ArrayBuffer 共享内存。
Buffer.from(buffer) 返回一个 Buffer,包含传入的 Buffer 的内容的拷贝。
Buffer.from(string[, encoding]) 返回一个 Buffer,包含传入的字符串的拷贝。
Buffer.alloc(size[, fill[, encoding]]) 返回一个指定大小且已初始化的 Buffer。 该方法比 Buffer.allocUnsafe(size) 慢,但能确保新创建的 Buffer 不会包含旧数据。
Buffer.allocUnsafe(size) 与 Buffer.allocUnsafeSlow(size) 返回一个指定大小但未初始化的 Buffer。 因为 Buffer 是未初始化的,可能包含旧数据。
// 创建一个长度为 10、且用 01 填充的 Buffer。
const buf1 = Buffer.alloc(10,1);。
// 创建一个长度为 10、且未初始化的 Buffer。
// 这个方法比调用 Buffer.alloc() 更快,但返回的 Buffer 实例可能包含旧数据,因此需要使用 fill() 或 write() 重写。
const buf2 = Buffer.allocUnsafe(10);。
const buf3 = Buffer.from([1, 2, 3]);。
const buf4 = Buffer.from('tést');。
console.log(buf1); //<Buffer 01 01 01 01 01 01 01 01 01 01>。
console.log(buf2); //<Buffer 00 00 00 00 08 00 00 00 07 00>。
console.log(buf3); //<Buffer 01 02 03>。
console.log(buf4); //<Buffer 74 c3 a9 73 74>。
2、Buffer对象提供的toString、JSON的使用。
1)buf.toString(encoding,start,end)。
var bf = Buffer.from('miaov');。
console.log(bf.toString('utf-8',1,4)); //iaov。
console.log(bf.toString('utf-8',0,5)); //miaov。
console.log(bf.toString('utf-8',0,6)); //miaov。
2)buf.write(string,offset,length,encoding)。
string 要写入 buf 的字符串。
offset 开始写入的偏移量。默认 0,这里指的是buffer对象的起始要写入的位置。
length 要写入的字节数。默认为 buf.length - offset。
encoding string 的字符编码。默认为 'utf8'。
返回: 已写入的字节数。
var str = "miaov hello";。
var bf = Buffer.from(str);。
var bf2 = Buffer.alloc(8);。
//从0开始写入5个
bf2.write(str,0,5);。
console.log(bf);。
console.log(bf2);。
3)buf.toJSON()
const buf = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5]);。
const json = JSON.stringify(buf);。
console.log(json);。
// 输出: {"type":"Buffer","data":[1,2,3,4,5]}。
3、Buffer中静态方法的使用。
1)Buffer.isEncoding(encoding) : 判断是否是Buffer支持的字符编码,是则返回true,不是则返回false。
console.log(Buffer.isEncoding('utf-8')); //true。
2)Buffer.isBuffer(obj) :如果 obj 是一个 Buffer,则返回 true,否则返回 false。
(5)fs(文件系统)
该模块是核心模块,需要使用require('fs')导入后使用,该模块主要用来操作文件。
1、fs.open(path, flags, mode, callback)。
path:要打开的文件的路径;
flags:打开文件的方式 读/写;
mode:设置文件的模式 读/写/执行。
callback(err,fd):文件打开以后,在回调函数中做相应的处理,回调函数的两个参数:
err:文件打开失败的错误保存在err里面,如果成功err为null。
fd:被打开文件的标识
var fs = require('fs');。
fs.open('./test.txt','r',function(err,fd){。
if(err){
console.log("文件打开失败");。
}else{
console.log("文件打开成功");。
}
});
2、fs.openSync(path, flags, mode) :返回文件描述符。
var fs = require('fs');。
console.log(fs.openSync('./test.txt','r')); //3。
3、fs.read(fd, buffer, offset, length, position, callback)。
从 fd 指定的文件中读取数据;
buffer 指定要写入数据的 buffer;
offset 指定 buffer 中开始写入的偏移量;
length 指定要读取的字节数;
position 指定文件中开始读取的偏移量。 如果 position 为 null,则从文件的当前位置开始读取;
callback 有三个参数 (err, bytesRead, buffer)。
示例:test.txt 中的值为123456789。
fs.open('./test.txt','r',function(err,fd){。
if(!err){
var bf = Buffer.alloc(5);。
fs.read(fd,bf,0,5,0,function(){。
console.log(bf.toString()); //12345。
})
}
});
4、fs.write(fd, buffer, offset, length, position, callback)。
将 buffer 写入到 fd 指定的文件。
offset 指定 buffer 中要开始被写入的偏移量,length 指定要写入的字节数。
position 指定文件中要开始写入的偏移量。 如果 typeof position !== 'number',则从当前位置开始写入。
callback 有三个参数 (err, bytesWritten, buffer),其中 bytesWritten 指定 buffer 中已写入文件的字节数。
var fs = require('fs');。
fs.open('./test.txt','r+',function(err,fd){。
if(!err){
var bf = Buffer.alloc(5);。
fs.read(fd,bf,0,5,0,function(){。
console.log(bf.toString()); //12345。
});
var bf = Buffer.from('test数据');。
fs.write(fd,bf,0,10,0);。
fs.write(fd,'测试数据2',10,'utf-8');。
}
});
fs.write(fd, string, position, encoding, callback)。
将 string 写入到 fd 指定的文件。 如果 string 不是一个字符串,则会强制转换成字符串。
position 指定文件中要开始写入的偏移量。 如果 typeof position !== 'number',则从当前位置开始写入。
encoding 指定字符串的编码。
callback 有三个参数 (err, written, string),其中 written 指定字符串中已写入文件的字节数。 写入的字节数与字符串的字符数是不同的。
5、fs.exists(path,callback)检查指定路径的文件或者目录是否存在。
fs.appendFile(path, data, callback):将数据追加到文件,如果文件不存在则创建文件。
//检查文件是否存在
var fs = require('fs');。
var filename = './test2.txt';。
fs.exists(filename,function(isExists){。
if(!isExists){。
fs.writeFile(filename,'miaov',function(err){。
if(err){。
console.log("文件创建失败");。
}else{。
console.log("文件创建成功");。
}。
});。
}else{
fs.appendFile(filename,'-leo',function(err){。
if(err){。
console.log("文件内容追加失败");。
}else{。
console.log("文件内容追加成功");。
}。
})
}
});
(6)前端项目自动化构建
1、创建myProject项目文件以及对应的文件夹。
var projectData ={。
'name':'myProject',。
'fileData':[。
{
'name':'css',。
'type':'dir'。
},{
'name':'js',。
'type':'dir'。
},{
'name':'images',。
'type':'dir'。
},{
'name':'index.html',。
'type':'file',。
'content' : '<html>\n\t<head>\n\t\t<title>title</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello</h1>\n\t</body>\n</html>'。
}
]
};
var fs = require('fs');。
if(projectData.name){。
// 创建项目文件夹
fs.mkdirSync(projectData.name);。
var fileData = projectData.fileData;。
if(fileData && fileData.length){。
fileData.forEach(function(file){。
//文件或文件夹路径。
file.path = './'+projectData.name +'/'+ file.name;。
//根据type类型创建文件或文件夹。
file.content = file.content || '';。
switch(file.type){。
case 'dir':。
fs.mkdirSync(file.path);。
break;。
case 'file':。
fs.writeFileSync(file.path,file.content);。
break;。
default:。
break;。
}
});
}
2、自动打包多个文件
var fs = require('fs');。
var filedir = './myProject/dist';。
fs.exists(filedir,function(isExists){。
if(!isExists){。
fs.mkdirSync(filedir);。
}
fs.watch(filedir,function(ev,file){。
//只要有一个文件发生了变化,我们就需要对文件夹下的所有文件进行读取、合并。
fs.readdir(filedir,function(err,dataList){。
var arr = [];。
dataList.forEach(function(file){。
if(file){。
//statSync查看文件属性。
var info = fs.statSync(filedir + '/' +file);。
//mode文件权限。
if(info.mode === 33206){。
arr.push(filedir + '/' +file);。
}。
}。
});。
//读取数组中的文件内容。
var content = '';。
arr.forEach(function(file){。
var c = fs.readFileSync(file);。
content += c.toString()+'\n';。
});。
//合并文件中的内容。
fs.writeFileSync('./myProject/js/index.js',content);。
})
});
});
(7)使用node进行web开发。
1、搭建一个http的服务器,用于处理用户发送的http请求。
//加载一个http模块
var http = require('http');。
//通过http模块下的createServer创建并返回一个web服务器对象。
var server = http.createServer();。
//开启 HTTP 服务器监听连接,只有调用了listen方法以后,服务器才开始工作。
server.listen(8000,'localhost');。
//服务器是否正在监听连接
server.on('listening',function(){。
console.log("listening..........");。
});
//每次接收到一个请求时触发,每个连接可能有多个请求(在 HTTP keep-alive 连接的情况下)。
server.on('request',function(){。
res.write('<p>hello</p>');。
res.end();。
});
2、request方法有两个参数:request、response。
1)request:http.IncomingMessage的一个实例,获取请求的一些信息,如头信息,数据等。
httpVession:使用的http协议的版本。
headers:请求头信息中的数据。
url:请求的地址
method:请求的方式
2)response:http.ServerResponse的一个实例,可以向请求的客户端输出返回响应。
write(chunk,encoding):发送一个数据块到相应正文中。
end(chunk,encoding):当所有的正文和头信息发送完成以后调用该方法告诉服务器数据已经全部发送完成了,这个方法在每次完成信息发送以后必须调用,并且是最后调用。
statusCode:该属性用来设置返回的状态码。
setHeader(name,value):设置返回头信息。
writeHead(statusCode,reasonPhrase,headers)这个方法只能在当前请求中使用一次,并且必须在response.end()之前调用。
3、使用fs模块实现行为表现分离。
var http = require('http');。
var url = require('url');。
var fs = require('fs');。
var server = http.createServer();。
//html文件的路径
var htmlDir = __dirname + '/html/';。
server.on('request',function(request,response){。
var urlStr = url.parse(request.url);。
//根据pathname匹配对应的html文件。
switch(urlStr.pathname){。
case '/':。
sendData(htmlDir + 'index.html',request,response);。
break;。
case '/user':。
sendData(htmlDir + 'user.html',request,response);。
break;。
case '/login':。
sendData(htmlDir + 'login.html',request,response);。
break;。
default:。
//处理其他情况。
sendData(htmlDir + 'err.html',request,response );。
break;。
}
});
function sendData(file,request,response){。
//读取文件,存在则返回对应读取的内容,不存在则返回错误信息。
fs.readFile(file,function(err,data){。
if(err){。
response.writeHead(404,{。
'content-type':'text/html;charset=utf-8'。
});。
response.end('<h1>页面不存在</h1>')。
}else{
response.writeHead(200,{。
'content-type':'text/html;charset=utf-8'。
});。
response.end(data);。
}
})
server.listen(8000,'localhost');。
路由设置问题
在浏览器输入路由器地址:192.168.1.1可进入管理界面用户名admin密码admin。
2、开始配置路由器。
进入路由器管理界面,会弹。
出一个类似下图“设置向导”界面,选下一步按提示操作。
3、假设您的宽带接入方式为 ADSL PPPoE ,那就选择“WAN口连接类型”为“PPPoE”,填入“上网账号” 、“上网口令”,再选择连接模式为:“自动连接”,点击“保存”即完成配置;保存完后“上网口令”框内填入的密码会多出几位,这是路由器为了安全起见专门做的,为此路由器的基本设置完成。
4、设置IP地址 :192. 168. 1. 11(X范围2-254)、具体参考说明的分配。
子网掩码:255. 255. 255. 0 、
默认网关:192. 168. 1. 1 ,填完以后“确定”两次即可。
重庆DNS :61.128.128.68。
5、设置好重起机打开在浏览器可上网。
如有不懂 QQ515096674。
表示该向量的行扩展
把temp缀在T后
T+temp表示向量相加,提示表示格式不符或尺度不符.。
VB中的字符串相加和Matlab的字符串相加是不同的。
VB中的“+”有时为5+6=11的算法,有时为 "a" + "b"="ab"的效果。
望采纳!