1.用C語言產生均勻分佈的隨機數
(1)功能
產生(a,b)區間上均勻分佈的隨機數
(2)函數簡介
均勻分佈函數的概率密度函數爲
通常用U(a,b)表示,
均勻分佈的均值爲
方差爲
產生均勻分佈的隨機數的方法:
混合同餘法
採用混合同餘法,
產生(0,1)區間上的隨機數y_i,通常選取a=2045,c=1,M=2^20;任意給定一個初始值X_(i-1),即可得到一個隨機數,
產生(a,b)區間上的隨機數z_i。使用指針變量*s,使得每次產生的隨機數都不一樣,只要改變循環的次數,就可以得到任意多個0~1隨機數
(3)實現代碼
子函數程序(產生隨機數)
//a爲給定區間的下限 b爲給定區間的上限 seed 指針變量,*seed爲隨機數的種子
double uniform(a,b,seed)
double a,b;
long int *seed;
{
double t;
*seed=2045*(*seed+1);
*seed=*seed-(*seed/1048576)*1048576;
t=(*seed)/1048576.0;
t=a+(b-a)*t;
return(t);
}
例:產生50個0到1之間均勻分佈的隨機數
實現代碼
#include "stdio.h"
#include "uniform.c"
main()
{
double a,b,x;int i,j;
long int s;
double uniform(double,double,long int *);
a=0.0;
b=1.0;
s=24681;
for(i=0;i<50;i++) //產生50個0到1的隨機數
{x=uniform(a,b,&s);
printf("%d\t%13.7f",i,x);
printf("\n");
}
}
將產生的數據通過重定向的方法存入一個新的文本文件,並通過讀取文本文件畫出這些隨機數
%編譯生成可執行文件uniform1.exe
tcc uniform1.c
%通過重定向的方法另存數據
uniform1.exe > uniform1.txt
%畫圖
gnuplot
%作出滿足均勻分佈的隨機數的線狀圖
plot [0:49] [0:1] "uniform1.txt"u 1:2 w l
運行結果
(4)與MATLAB作圖對比
MATLAB作圖實現代碼
%產生一個長度爲50的隨機信號,該信號在區間[0,1]上均勻分佈
clf;
y=rand(1,50); %在[0,1]上用隨機函數rand()產生
plot(y);
運行結果
2.用C語言產生一個調幅波的波形
參考鏈接:https://blog.csdn.net/shaoyubin999/article/details/82740689
波形數據(時間長度爲1秒),並通過gnuplot作出2個被調信號週期上的波形圖。
設信號採樣率爲8000Hz,載波頻率爲1000Hz,被調信號爲100Hz。調製度爲0.5,表達式爲:
s(t)=(1+0.5cos(2π100t))cos(2π1000t)
s(t)=(1+0.5cos(2π100t))cos(2π1000t)
嘗試用最簡C代碼產生和實現,將1秒內的波形數據(共8000行,每行一個點,分採樣時間、採樣數值兩列,列以製表符TAB隔開。將波形數據直接打印輸出到屏幕上。2個週期的被調信號長度爲1/50秒,合160採樣點。
第一步 產生波形數據
//amdata.c --第1行:說明文件名
//用於計算AM調幅波數據1秒
#include<stdio.h>
#include<math.h>
#define pi 3.14159265
int main()
{
double s,t;
int i; //循環變量
for (i=0; i<8000; i++)
{
t=i/8000.0;
s=(1+0.5*cos(2*pi*100*t))*cos(2*pi*800*t);//信號的表達式
printf("%e\t%e\n",t,s);
}
}
第二步:用gnuplot畫出數據波形
第一種方法:
先對amdata.c編輯生成amdata.exe,然後調用
畫出其點狀圖
實現代碼(在.c文件所在的路徑下操作)
tcc amdate.c
gnuplot
plot [0:(1/50.0)] [-2:2] "<amdata.exe" u 1:2 w p
其中,[0:(1/50.0)]
定義了橫座標的範圍,[-2:2]
是縱座標的顯示範圍,u 1:2
表示使用數據文件的1,2列數據,w p
表示使用點作圖。
運行結果
畫出其線狀圖
實現代碼
plot [0:(1/50.0)] [-2:2] "<amdata.exe" u 1:2 w l
其中,[0:(1/50.0)]
定義了橫座標的範圍,[-2:2]
是縱座標的顯示範圍,u 1:2
表示使用數據文件的1,2列數據,w l
表示使用折線作圖。
運行結果
第二種方法:
通過重定向的方法生成數據文件,然後調用數據文件作圖
實現代碼
amdata.exe > amdata.txt
gnuplot
plot [0:(1/50.0)] [-2:2] "amdata.txt" u 1:2 w l
運行結果