C語言進階——使用C語言與gnuplot結合畫一些波形

1.用C語言產生均勻分佈的隨機數

(1)功能

產生(a,b)區間上均勻分佈的隨機數

(2)函數簡介

均勻分佈函數的概率密度函數爲
f(x)={1baaxb0 f(x)=\begin{cases} \frac{1}{b-a} ,a\leq x\leq b\\ 0,其它 \end{cases}
通常用U(a,b)表示,

均勻分佈的均值爲
a+b2 \frac{a+b}{2}
方差爲
(ab)212 \frac{(a-b)^2}{12}
產生均勻分佈的隨機數的方法:

混合同餘法

在這裏插入圖片描述
f(x)={Xi=(aXi1+c)(modM)yi=XiM f(x)=\begin{cases}X_i =(aX_{i-1}+c) (mod M)\\ y_i =\frac{X_i}{M}\end{cases}

採用混合同餘法,

產生(0,1)區間上的隨機數y_i,通常選取a=2045,c=1,M=2^20;任意給定一個初始值X_(i-1),即可得到一個隨機數,
zi=a+(ba)yi z_i=a+(b-a)y_i
產生(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

運行結果
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章