added doc for random generators

Changes to be committed:
	modified:   dspl/doc/html/formula.repository
	modified:   dspl/dox/ru/filter_ap.dox
	modified:   dspl/dox/ru/filter_fir.dox
	modified:   dspl/dox/ru/inout.dox
	modified:   dspl/dox/ru/randgen.dox
	modified:   dspl/src/dspl_internal.h
	modified:   dspl/src/filter_ft.c
	modified:   dspl/src/inout.c
	modified:   dspl/src/randgen.c
	new file:   examples/src/ellip_ap_test.c
	new file:   examples/src/fir_linphase_test.c
	new file:   examples/src/randb_test.c
	new file:   examples/src/randi_test.c
	new file:   examples/src/randn_test.c
	modified:   include/dspl.c
	modified:   include/dspl.h
pull/6/merge
Dsplib 2020-05-07 13:13:34 +03:00
rodzic 22a4dced8a
commit a2f2d22a9b
16 zmienionych plików z 1158 dodań i 180 usunięć

Wyświetl plik

@ -1,129 +1,141 @@
\form#0:\[ e = \max \left( \frac{|x(k) - y(k)| }{ |x(k)|} \right), \quad \quad |x(k)| > 0, \]
\form#1:\[ e = \max(|x(k) - y(k)| ), ~\qquad \quad~|x(k)| = 0, \]
\form#2:$ e$
\form#3:\[ e = \max \left( \frac{|x(k) - y(k)|}{|x(k)|} \right), \quad \quad |x(k)| > 0, \]
\form#4:$ C_ord(x)$
\form#5:\[ C_ord(x) = 2 x C_{ord-1}(x) - C_{ord-2}(x), \]
\form#6:$ C_0(x) = 1 $
\form#7:$ C_1(x) = x$
\form#8:$ U_{ord}(x)$
\form#9:\[ U_{ord}(x) = 2 x U_{ord-1}(x) - U_{ord-2}(x), \]
\form#10:$ U_0(x) = 1 $
\form#11:$ U_1(x) = 2x$
\form#12:$ x = a + j b $
\form#13:\[ |x|^2 = x x^* = a^2 + b^2. \]
\form#14:\[ \textrm{Arccos}(x) = \frac{\pi}{2} - \textrm{Arcsin}(x) = \frac{\pi}{2} -j \textrm{Ln}\left( j x + \sqrt{1 - x^2} \right) \]
\form#15:\[ \textrm{Arcsin}(x) = j \textrm{Ln}\left( j x + \sqrt{1 - x^2} \right) \]
\form#16:\[ \textrm{cos}(x) = \frac{\exp(jx) + \exp(-jx)}{2} \]
\form#17:\[ \textrm{Ln}(x) = j \varphi + \ln(|x|), \]
\form#18:$\varphi$
\form#19:\[ \textrm{sin}(x) = \frac{\exp(jx) - \exp(-jx)}{2j} \]
\form#20:\[ y(k) = \sqrt{x(k)}, \qquad k = 0 \ldots n-1. \]
\form#21:$ c = a * b$
\form#22:$a$
\form#23:$b$
\form#24:$n = n_0 \times n_1 \times n_2 \times \ldots \times n_p \times m$
\form#25:$n_i = 2,3,5,7$
\form#26:$m $
\form#27:\[ H(z) = \frac{\sum_{n = 0}^{N} b_n z^{-n}} {1+{\frac{1}{a_0}}\sum_{m = 1}^{M} a_m z^{-m}}, \]
\form#28:$a_0$
\form#29:$N=M=$
\form#30:$H(z)$
\form#31:$s(t) = \sin(2\pi \cdot 0.05 t) + n(t)$
\form#32:$n(t)$
\form#33:$ n $
\form#34:$ x(m) $
\form#35:$ m = 0 \ldots n-1 $
\form#36:\[ Y(k) = \sum_{m = 0}^{n-1} x(m) \exp \left( -j \frac{2\pi}{n} m k \right), \]
\form#37:$ k = 0 \ldots n-1 $
\form#38:$x(m)$
\form#39:$n$
\form#40:$Y(k)$
\form#41:$ n^2 $
\form#42:\[ y(k) = \sum_{m = 0}^{n-1} x(m) \exp \left( j \frac{2\pi}{n} m k \right), \]
\form#43:$y(k)$
\form#44:$ u = \textrm{cd}^{-1}(w, k)$
\form#45:$ w $
\form#46:$ k $
\form#47:$ u = \textrm{sn}^{-1}(w, k)$
\form#48:$ y = \textrm{cd}(u K(k), k)$
\form#49:$ u $
\form#50:$ k_i $
\form#51:$ K(k) $
\form#52:\[ K(k) = \frac{\pi}{2} \prod_{i = 1}^{\infty}(1+k_i), \]
\form#53:$ k_0 = k$
\form#54:\[ k_i = \left( \frac{k_{i-1}} { 1+\sqrt{1-k_{i-1}^2} } \right)^2 \]
\form#55:$ k<1 $
\form#56:$ y = \textrm{sn}(u K(k), k)$
\form#57:\[ Y(k) = \frac{1}{N} \sum_{m = 0}^{n-1} x(m) \exp \left( j \frac{2\pi}{n} m k \right), \]
\form#58:$n = n_0 \times n_1 \times n_2 \times n_3 \times \ldots \times n_p \times m$
\form#59:$n = n_0 \times n_1 \times n_2 \ldots \times n_p \times m$
\form#60:$ n = 725760 $
\form#61:$725760 = 2 \cdot 3 \cdot 4 \cdot 5 \cdot 6 \cdot 7 \cdot 9 \cdot 16 $
\form#62:$ n = 172804 = 43201 \cdot 4 $
\form#63:$ n = 13 \cdot 17 \cdot 23 \cdot 13 = 66079 $
\form#64:$\sqrt{2^{31}} = 46340.95$
\form#65:$x_0$
\form#66:$x_1$
\form#67:$x(k) = x_0 + k \cdot dx$
\form#68:$dx = \frac{x_1 - x_0}{n-1}$
\form#69:$k = 0 \ldots n-1.$
\form#70:$dx = \frac{x_1 - x_0}{n}$
\form#71:$10^{x_0}$
\form#72:$10^{x_1}$
\form#73:$x(k) = 10^{x_0} \cdot dx^k$
\form#74:$dx = \sqrt[n-1]{10^{x_1 - x_0}}$
\form#75:$dx = \sqrt[n]{10^{x_1 - x_0}}$
\form#76:$ H(j \omega) $
\form#77:$ H(j \omega)$
\form#78:$ H(s) $
\form#79:\[ H(s) = \frac {\sum_{k = 0}^{N} b_k s^k} {\sum_{m = 0}^{N} a_m s^m}, \]
\form#80:$ N $
\form#81:$ s = j \omega $
\form#82:$ \omega $
\form#83:$H(s)$
\form#84:$ H \left(\mathrm{e}^{j\omega} \right) $
\form#85:$ 2\pi $
\form#86:$ \pi $
\form#87:$ -\pi $
\form#88:$ H \left(e^{j \omega} \right)$
\form#89:\[ H(z) = \frac {\sum_{k = 0}^{N} b_k z^{-k}} {\sum_{m = 0}^{N} a_m z^{-m}}, \]
\form#90:$N$
\form#91:$z = e^{j \omega} $
\form#92:$\omega$
\form#93:$ 2 \pi-$
\form#94:$2 \pi$
\form#95:$-\pi$
\form#96:$ \pi$
\form#97:$ H \left(e^{j \omega} \right) = H^* \left(e^{-j \omega} \right)$
\form#98:$\pi$
\form#99:$ -R_p $
\form#100:$ H(s)$
\form#101:$-R_p$
\form#102:$ R_p $
\form#103:$-R_s$
\form#104:$H(j\cdot 1) = -R_s$
\form#105:\[ H(s) = \frac{\sum_{n = 0}^{N_z} b_n \cdot s^n}{\sum_{m = 0}^{N_p} a_m \cdot s^m} = \frac{\prod_{n = 0}^{N_z}(s-z_n)}{\prod_{m = 0}^{N_p} (s-p_m)} \]
\form#106:\[ H(z) = \sum_{n = 0}^{ord} h_n z^{-n} \]
\form#107:$ F(s) $
\form#108:$F(s)$
\form#109:$Y(s) = (H \circ F)(s) = H(F(s))$
\form#110:\[ H(s) = \frac{\sum\limits_{m = 0}^{n} b_m s^m} {\sum\limits_{k = 0}^{n} a_k s^k}, \quad F(s) = \frac{\sum\limits_{m = 0}^{p} d_m s^m} {\sum\limits_{k = 0}^{p} c_k s^k}, \quad Y(s) = \frac{\sum\limits_{m = 0}^{n p} \beta_m s^m} {\sum\limits_{k = 0}^{n p} \alpha_k s^k} \]
\form#111:$Y(s) = (H \circ F)(s)$
\form#112:\[ s \leftarrow \frac{1 - z^{-1}}{1 - z^{-1}}. \]
\form#113:$\Omega$
\form#114:\[ \Omega = \tan(\omega / 2). \]
\form#115:\[ s(t) = \sum\limits_{n = 0}^{n_{\omega}-1} S(\omega_n) \exp(j\omega_n t) \]
\form#116:$\omega_n$
\form#117:$S(\omega_n)$
\form#118:$ I_0(x)$
\form#119:$ x $
\form#120:$[0 \ 3]$
\form#121:$ \textrm{sinc}(x,a) = \frac{\sin(ax)}{ax}$
\form#122:\[ \textrm{Si}(x) = \int_{0}^{x} \frac{\sin(x)}{x} \, dx\]
\form#123:$[-6\pi \ 6\pi]$
\form#124:$P_N(x)$
\form#125:$N-$
\form#126:\[ P_N(x) = a_0 + a_1 \cdot x + a_2 \cdot x^2 + a_3 \cdot x^3 + ... a_N \cdot x^N. \]
\form#127:\[ P_N(x) = a_0 + x \cdot (a_1 + x \cdot (a_2 + \cdot ( \ldots x \cdot (a_{N-1} + x\cdot a_N) \ldots ))) \]
\form#128:$10^{56}$
\form#0:$x(i)$
\form#1:$i = 0,1,\ldots n$
\form#2:$y(i)$
\form#3:\[ y(i) = k_x x(i) + d_x, \qquad k_x = \frac{h}{x_{\textrm{max}} - x_{\textrm{min}}}. \]
\form#4:$x_{\textrm{min}}$
\form#5:$x_{\textrm{max}}$
\form#6:$d_x$
\form#7:$h + d_x$
\form#8:\[ e = \max \left( \frac{|x(k) - y(k)| }{ |x(k)|} \right), \quad \quad |x(k)| > 0, \]
\form#9:\[ e = \max(|x(k) - y(k)| ), ~\qquad \quad~|x(k)| = 0, \]
\form#10:$ e$
\form#11:\[ e = \max \left( \frac{|x(k) - y(k)|}{|x(k)|} \right), \quad \quad |x(k)| > 0, \]
\form#12:$ C_ord(x)$
\form#13:\[ C_ord(x) = 2 x C_{ord-1}(x) - C_{ord-2}(x), \]
\form#14:$ C_0(x) = 1 $
\form#15:$ C_1(x) = x$
\form#16:$ U_{ord}(x)$
\form#17:\[ U_{ord}(x) = 2 x U_{ord-1}(x) - U_{ord-2}(x), \]
\form#18:$ U_0(x) = 1 $
\form#19:$ U_1(x) = 2x$
\form#20:$ x = a + j b $
\form#21:\[ |x|^2 = x x^* = a^2 + b^2. \]
\form#22:\[ \textrm{Arccos}(x) = \frac{\pi}{2} - \textrm{Arcsin}(x) = \frac{\pi}{2} -j \textrm{Ln}\left( j x + \sqrt{1 - x^2} \right) \]
\form#23:\[ \textrm{Arcsin}(x) = j \textrm{Ln}\left( j x + \sqrt{1 - x^2} \right) \]
\form#24:\[ \textrm{cos}(x) = \frac{\exp(jx) + \exp(-jx)}{2} \]
\form#25:\[ \textrm{Ln}(x) = j \varphi + \ln(|x|), \]
\form#26:$\varphi$
\form#27:\[ \textrm{sin}(x) = \frac{\exp(jx) - \exp(-jx)}{2j} \]
\form#28:\[ y(k) = \sqrt{x(k)}, \qquad k = 0 \ldots n-1. \]
\form#29:$ c = a * b$
\form#30:$a$
\form#31:$b$
\form#32:$n = n_0 \times n_1 \times n_2 \times \ldots \times n_p \times m$
\form#33:$n_i = 2,3,5,7$
\form#34:$m $
\form#35:\[ H(z) = \frac{\sum_{n = 0}^{N} b_n z^{-n}} {1+{\frac{1}{a_0}}\sum_{m = 1}^{M} a_m z^{-m}}, \]
\form#36:$a_0$
\form#37:$N=M=$
\form#38:$H(z)$
\form#39:$s(t) = \sin(2\pi \cdot 0.05 t) + n(t)$
\form#40:$n(t)$
\form#41:$ n $
\form#42:$ x(m) $
\form#43:$ m = 0 \ldots n-1 $
\form#44:\[ Y(k) = \sum_{m = 0}^{n-1} x(m) \exp \left( -j \frac{2\pi}{n} m k \right), \]
\form#45:$ k = 0 \ldots n-1 $
\form#46:$x(m)$
\form#47:$n$
\form#48:$Y(k)$
\form#49:$ n^2 $
\form#50:\[ y(k) = \sum_{m = 0}^{n-1} x(m) \exp \left( j \frac{2\pi}{n} m k \right), \]
\form#51:$y(k)$
\form#52:$ u = \textrm{cd}^{-1}(w, k)$
\form#53:$ w $
\form#54:$ k $
\form#55:$ u = \textrm{sn}^{-1}(w, k)$
\form#56:$ y = \textrm{cd}(u K(k), k)$
\form#57:$ u $
\form#58:$ k_i $
\form#59:$ K(k) $
\form#60:\[ K(k) = \frac{\pi}{2} \prod_{i = 1}^{\infty}(1+k_i), \]
\form#61:$ k_0 = k$
\form#62:\[ k_i = \left( \frac{k_{i-1}} { 1+\sqrt{1-k_{i-1}^2} } \right)^2 \]
\form#63:$ k<1 $
\form#64:$ y = \textrm{sn}(u K(k), k)$
\form#65:\[ Y(k) = \frac{1}{N} \sum_{m = 0}^{n-1} x(m) \exp \left( j \frac{2\pi}{n} m k \right), \]
\form#66:$n = n_0 \times n_1 \times n_2 \times n_3 \times \ldots \times n_p \times m$
\form#67:$n = n_0 \times n_1 \times n_2 \ldots \times n_p \times m$
\form#68:$ n = 725760 $
\form#69:$725760 = 2 \cdot 3 \cdot 4 \cdot 5 \cdot 6 \cdot 7 \cdot 9 \cdot 16 $
\form#70:$ n = 172804 = 43201 \cdot 4 $
\form#71:$ n = 13 \cdot 17 \cdot 23 \cdot 13 = 66079 $
\form#72:$\sqrt{2^{31}} = 46340.95$
\form#73:$x_0$
\form#74:$x_1$
\form#75:$x(k) = x_0 + k \cdot dx$
\form#76:$dx = \frac{x_1 - x_0}{n-1}$
\form#77:$k = 0 \ldots n-1.$
\form#78:$dx = \frac{x_1 - x_0}{n}$
\form#79:$10^{x_0}$
\form#80:$10^{x_1}$
\form#81:$x(k) = 10^{x_0} \cdot dx^k$
\form#82:$dx = \sqrt[n-1]{10^{x_1 - x_0}}$
\form#83:$dx = \sqrt[n]{10^{x_1 - x_0}}$
\form#84:$ H(j \omega) $
\form#85:$ H(j \omega)$
\form#86:$ H(s) $
\form#87:\[ H(s) = \frac {\sum_{k = 0}^{N} b_k s^k} {\sum_{m = 0}^{N} a_m s^m}, \]
\form#88:$ N $
\form#89:$ s = j \omega $
\form#90:$ \omega $
\form#91:$H(s)$
\form#92:$ H \left(\mathrm{e}^{j\omega} \right) $
\form#93:$ 2\pi $
\form#94:$ \pi $
\form#95:$ -\pi $
\form#96:$ H \left(e^{j \omega} \right)$
\form#97:\[ H(z) = \frac {\sum_{k = 0}^{N} b_k z^{-k}} {\sum_{m = 0}^{N} a_m z^{-m}}, \]
\form#98:$N$
\form#99:$z = e^{j \omega} $
\form#100:$\omega$
\form#101:$ 2 \pi-$
\form#102:$2 \pi$
\form#103:$-\pi$
\form#104:$ \pi$
\form#105:$ H \left(e^{j \omega} \right) = H^* \left(e^{-j \omega} \right)$
\form#106:$\pi$
\form#107:$ -R_p $
\form#108:$ H(s)$
\form#109:$-R_p$
\form#110:$ R_p $
\form#111:$-R_s$
\form#112:$H(j\cdot 1) = -R_s$
\form#113:\[ H(s) = \frac{\sum_{n = 0}^{N_z} b_n \cdot s^n}{\sum_{m = 0}^{N_p} a_m \cdot s^m} = \frac{\prod_{n = 0}^{N_z}(s-z_n)}{\prod_{m = 0}^{N_p} (s-p_m)} \]
\form#114:\[ H(z) = \sum_{n = 0}^{ord} h_n z^{-n} \]
\form#115:$ F(s) $
\form#116:$F(s)$
\form#117:$Y(s) = (H \circ F)(s) = H(F(s))$
\form#118:\[ H(s) = \frac{\sum\limits_{m = 0}^{n} b_m s^m} {\sum\limits_{k = 0}^{n} a_k s^k}, \quad F(s) = \frac{\sum\limits_{m = 0}^{p} d_m s^m} {\sum\limits_{k = 0}^{p} c_k s^k}, \quad Y(s) = \frac{\sum\limits_{m = 0}^{n p} \beta_m s^m} {\sum\limits_{k = 0}^{n p} \alpha_k s^k} \]
\form#119:$Y(s) = (H \circ F)(s)$
\form#120:\[ s \leftarrow \frac{1 - z^{-1}}{1 - z^{-1}}. \]
\form#121:$\Omega$
\form#122:\[ \Omega = \tan(\omega / 2). \]
\form#123:\[ s(t) = \sum\limits_{n = 0}^{n_{\omega}-1} S(\omega_n) \exp(j\omega_n t) \]
\form#124:$\omega_n$
\form#125:$S(\omega_n)$
\form#126:$ I_0(x)$
\form#127:$ x $
\form#128:$[0 \ 3]$
\form#129:$ \textrm{sinc}(x,a) = \frac{\sin(ax)}{ax}$
\form#130:\[ \textrm{Si}(x) = \int_{0}^{x} \frac{\sin(x)}{x} \, dx\]
\form#131:$[-6\pi \ 6\pi]$
\form#132:$P_N(x)$
\form#133:$N-$
\form#134:\[ P_N(x) = a_0 + a_1 \cdot x + a_2 \cdot x^2 + a_3 \cdot x^3 + ... a_N \cdot x^N. \]
\form#135:\[ P_N(x) = a_0 + x \cdot (a_1 + x \cdot (a_2 + \cdot ( \ldots x \cdot (a_{N-1} + x\cdot a_N) \ldots ))) \]
\form#136:$\mu$
\form#137:$\sigma$
\form#138:$\sigma^2$
\form#139:$\mu = 0$
\form#140:$\sigma=1$

Wyświetl plik

@ -491,6 +491,98 @@ www.dsplib.org
/*! ****************************************************************************
\ingroup IIR_FILTER_DESIGN_GROUP
\fn int ellip_ap(double rp, double rs, int ord, double* b, double* a)
\brief
Расчет передаточной характеристики \f$ H(s) \f$ аналогового
нормированного эллиптического ФНЧ.
Функция рассчитывает коэффициенты передаточной характеристики \f$H(s)\f$
аналогового нормированного эллиптического ФНЧ порядка `ord`
с частотой среза 1 рад/с по уровню \f$-R_p\f$ дБ. \n
Особенностью эллиптического фильтра являются равноволновые пульсации
АЧХ как в полосе пропускания, так и в полосе заграждения, в результате
чего обеспечиваеся минимальная переходная полоса фильтра. \n
\param[in] rp
Уровень пульсаций в полосе пропускания (дБ). \n
Значение должно быть положительным. \n
\n
\param[in] Rs
Уровень подавления в полосе заграждения (дБ). \n
Значение должно быть положительным. \n
\n
\param[in] ord
Порядок фильтра. \n
Количество коэффициентов числителя и знаменателя
передаточной функции \f$H(s)\f$ равно `ord+1`. \n
\n
\param[out] b
Указатель на вектор коэффициентов числителя
передаточной функции \f$H(s)\f$. \n
Размер вектора `[ord+1 x 1]`. \n
Память должна быть выделена. \n
\n
\param[out] a
Указатель на вектор коэффициентов знаменателя
передаточной функции \f$H(s)\f$. \n
Размер вектора `[ord+1 x 1]`. \n
Память должна быть выделена. \n
\n
Пример использования функции `ellip_ap`:
\include ellip_ap_test.c
Результат работы программы:
\verbatim
b[ 0] = 0.268 a[ 0] = 0.301
b[ 1] = 0.000 a[ 1] = 0.764
b[ 2] = 0.045 a[ 2] = 1.472
b[ 3] = 0.000 a[ 3] = 0.948
b[ 4] = 0.001 a[ 4] = 1.000
\endverbatim
\n
В каталоге `dat` будут созданы три файла: \n
\verbatim
ellip_ap_test_mag.txt АЧХ фильтра
ellip_ap_test_phi.txt ФЧХ фильтра
ellip_ap_test_tau.txt ГВЗ фильтра
\endverbatim
\n
Кроме того программа GNUPLOT произведет построение следующих графиков
по сохраненным в файлах данным:
\image html ellip_ap_test.png
\return
`RES_OK` --- фильтр рассчитан успешно. \n
В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n
\author
Бахурин Сергей
www.dsplib.org
***************************************************************************** */
/*! ****************************************************************************

Wyświetl plik

@ -114,6 +114,17 @@ DSPL_FILTER_BSTOP - режекторный фильтр.
В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n
Пример использования функции:
\include fir_linphase_test.c
Программа расчитывает коэффициенты и АЧХ линейно-фазовых КИХ-фильтрова нижних,
верхних частот, полосовых и режекторных с применением различных весовых окон:
прямоугольное, Хемминга, Илэкмана и Блэкмана-Харриса. \n
Полученные АЧХ выводятся на график
\image html fir_linphase_test.png
\author
Бахурин Сергей

Wyświetl plik

@ -156,3 +156,60 @@ x[n-1] y[n-1]
Бахурин Сергей
www.dsplib.org
***************************************************************************** */
/*! ****************************************************************************
\ingroup IN_OUT_GROUP
\fn int writetxt_int(int* x, int* y, int n, char* fn)
\brief
Сохранить целочисленные данные в текстовый файл
Функция сохраняет целочисленные данные в текстовый файл `fn`. \n
Файл имеет следующий формат: \n
\verbatim
x[0] y[0]
x[1] y[1]
... ...
x[n-1] y[n-1]
\endverbatim
Файл может быть использован для построения графика сторонней программой,
например пакетом GNUPLOT (см. раздел \ref PLOT_GROUP). \n
\param[in] x
Указатель на первый вектор. \n
Размер вектора `[n x 1]`. \n
\n
\param[in] y
Указатель на второй вектор. \n
Размер вектора `[n x 1]`. \n
Может быть `NULL`. \n
Файл будет содержать только один столбец соответствующий
вектору `x` если `y == NULL`. \n
\n
\param[in] n
Размер входных векторов. \n
\n
\param[in] fn
Имя файла. \n
\n
\return
`RES_OK` --- файл сохранен успешно. \n
В противном случае \ref ERROR_CODE_GROUP "код ошибки": \n
\author
Бахурин Сергей
www.dsplib.org
***************************************************************************** */

Wyświetl plik

@ -100,6 +100,219 @@ www.dsplib.org
/*! ****************************************************************************
\ingroup SPEC_MATH_RAND_GEN_GROUP
\fn int randb(double* x, int n, random_t* prnd)
\brief
Генерация бинарного униполярного [0, 1] псевдослучайного вектора
Функция генерирует униполярный псевдослучайный вектор,
каждый элемент которого принимает равновероятное значение 0 или 1.
\param[in,out] x
Указатель на вектор случайных бинарных чисел. \n
Размер вектора `[n x 1]`. \n
Память должна быть выделена. \n\n
\param[in] n
Размер вектора `x`. \n\n
\param[in] prnd
Указатель на структуру `random_t` параметров датчиков
псевдослучайных чисел. \n
Структура должна быть предварительно заполнена функцией \ref random_init. \n
Данный указатель может быть `NULL`, тогда будет использоваться
встроенный датчик, определенный стандартом языка Си. Однако для серьезных нужд,
например в криптографии, данный режим использовать не рекомендуется.
Нет гарантии в качестве произведенной случайной последовательности если
параметр `prnd` задан как `NULL`. \n\n
\return
`RES_OK` --- вектор целых псевдослучайных чисел рассчитан успешно. \n
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
Пример использования функции:
\include randb_test.c
Программа рассчитывает униполярный [0, 1] и биполярный [-1, 1] бинарные
псевдослучайные векторы.
В результате выполнения программы можно увидеть график:
\image html randb_test.png
\author
Бахурин Сергей.
www.dsplib.org
***************************************************************************** */
/*! ****************************************************************************
\ingroup SPEC_MATH_RAND_GEN_GROUP
\fn int randb2(double* x, int n, random_t* prnd)
\brief
Генерация бинарного биполярного [-1, 1] псевдослучайного вектора
Функция генерирует биполярный псевдослучайный вектор,
каждый элемент которого принимает равновероятное значение -1 или 1.
\param[in,out] x
Указатель на вектор случайных бинарных чисел. \n
Размер вектора `[n x 1]`. \n
Память должна быть выделена. \n\n
\param[in] n
Размер вектора `x`. \n\n
\param[in] prnd
Указатель на структуру `random_t` параметров датчиков
псевдослучайных чисел. \n
Структура должна быть предварительно заполнена функцией \ref random_init. \n
Данный указатель может быть `NULL`, тогда будет использоваться
встроенный датчик, определенный стандартом языка Си. Однако для серьезных нужд,
например в криптографии, данный режим использовать не рекомендуется.
Нет гарантии в качестве произведенной случайной последовательности если
параметр `prnd` задан как `NULL`. \n\n
\return
`RES_OK` --- вектор целых псевдослучайных чисел рассчитан успешно. \n
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
Пример использования функции:
\include randb_test.c
Программа рассчитывает униполярный [0, 1] и биполярный [-1, 1] бинарные
псевдослучайные векторы.
В результате выполнения программы можно увидеть график:
\image html randb_test.png
\author
Бахурин Сергей.
www.dsplib.org
***************************************************************************** */
/*! ****************************************************************************
\ingroup SPEC_MATH_RAND_GEN_GROUP
\fn int randi(int* x, int n, int start, int stop, random_t* prnd)
\brief
Генерация целочисленного вектора равномерно
распределенных псевдослучайных чисел.
Функция генерирует псевдослучайный вектор целых чисел в диапазоне от `start`
до `stop` включительно.
\param[in,out] x
Указатель на вектор случайных чисел. \n
Размер вектора `[n x 1]`. \n
Память должна быть выделена. \n\n
\param[in] n
Размер вектора `x`. \n\n
\param[in] start
Начало диапазона целых чисел. \n\n
\param[in] stop
Конец диапазона целых чисел. \n\n
\param[in] prnd
Указатель на структуру `random_t` параметров датчиков
псевдослучайных чисел. \n
Структура должна быть предварительно заполнена функцией \ref random_init. \n
Данный указатель может быть `NULL`, тогда будет использоваться
встроенный датчик, определенный стандартом языка Си. Однако для серьезных нужд,
например в криптографии, данный режим использовать не рекомендуется.
Нет гарантии в качестве произведенной случайной последовательности если
параметр `prnd` задан как `NULL`. \n\n
\return
`RES_OK` --- вектор целых псевдослучайных чисел рассчитан успешно. \n
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
Пример использования функции:
\include randi_test.c
Программа рассчитывает целочисленный вектор
псевдослучайных чисел в диапазоне [-4, 3].
В результате выполнения программы можно увидеть график:
\image html randi_test.png
\author
Бахурин Сергей.
www.dsplib.org
***************************************************************************** */
/*! ****************************************************************************
\ingroup SPEC_MATH_RAND_GEN_GROUP
\fn int randn(double* x, int n, double mu, double sigma, random_t* prnd)
\brief
Генерация вектора нормально распределенных псевдослучайных чисел.
Функция использует преобразование Бокса-Мюллера для приведения
равномерно-распределенных псевдослучайных чисел к нормальному распределению
с математическим ожиданием \f$\mu\f$ и средневадратическим
отклонением \f$\sigma\f$.
\param[in,out] x
Указатель на вектор случайных чисел. \n
Размер вектора `[n x 1]`. \n
Память должна быть выделена. \n\n
\param[in] n
Размер вектора случайных чисел. \n\n
\param[in] mu
Математическое ожидание \f$\mu\f$. \n\n
\param[in] sigma
Cредневадратическое отклонение \f$\sigma\f$. \n
Дисперсия сгенерированных чисел равна \f$\sigma^2\f$. \n\n
\param[in] prnd
Указатель на структуру `random_t` параметров датчиков
псевдослучайных чисел. \n
Структура должна быть предварительно заполнена функцией \ref random_init. \n
Данный указатель может быть `NULL`, тогда будет использоваться
встроенный датчик, определенный стандартом языка Си. Однако для серьезных нужд,
например в криптографии, данный режим использовать не рекомендуется.
Нет гарантии в качестве произведенной случайной последовательности если
параметр `prnd` задан как `NULL`. \n\n
\return
`RES_OK` --- вектор нормально распределенных
псевдослучайных чисел рассчитан успешно. \n
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
Пример использования функции:
\include randn_test.c
Программа рассчитывает независимые векторы нормально распределенных
псевдослучайных чисел, \f$\mu = 0\f$ и \f$\sigma=1\f$.
В результате выполнения программы можно увидеть график:
\image html randn_test.png
\author
Бахурин Сергей.
www.dsplib.org
***************************************************************************** */
/*! ****************************************************************************

Wyświetl plik

@ -97,6 +97,8 @@ int fir_linphase_lpf(int ord, double wp, int wintype,
#define MRG32K3A_A13 810728.0
#define MRG32K3A_A21 527612.0
#define MRG32K3A_A23 1370589.0
#define RAND_BUFSIZE 512
int iir_ap(double rp, double rs, int ord, int type, double* b, double* a);

Wyświetl plik

@ -222,7 +222,7 @@ int DSPL_API ratcompos(double* b, double* a, int n,
}
k2 = (n*p)+1;
k2s = k2*sizeof(double); /* alpha and beta size */
k2s = k2*sizeof(double); /* alpha and beta size */
nk2s = (n+1)*k2*sizeof(double); /* num, den, ndn and ndd size */
num = (double*)malloc(nk2s);
@ -291,6 +291,7 @@ int DSPL_API ratcompos(double* b, double* a, int n,
}
res = RES_OK;
exit_label:
if(num)
free(num);

Wyświetl plik

@ -222,7 +222,35 @@ int DSPL_API writetxt(double* x, double* y, int n, char* fn)
}
/******************************************************************************
Write a int arrays to the text file "fn"
*******************************************************************************/
int DSPL_API writetxt_int(int* x, int* y, int n, char* fn)
{
int k;
FILE* pFile = NULL;
if(!x)
return ERROR_PTR;
if(n < 1)
return ERROR_SIZE;
if(!fn)
return ERROR_FNAME;
pFile = fopen(fn, "w+");
if(pFile == NULL)
return ERROR_FOPEN;
if(y)
for(k = 0; k < n; k++)
fprintf(pFile, "% -14d\t% -14d\n", x[k], y[k]);
else
for(k = 0; k < n; k++)
fprintf(pFile, "% -.14d\n", x[k]);
fclose(pFile);
return RES_OK;
}

Wyświetl plik

@ -65,7 +65,59 @@ int DSPL_API random_init(random_t* prnd, int type, void* seed)
}
/*******************************************************************************
random generator of binary [0,1] signal
*******************************************************************************/
int DSPL_API randb(double* x, int n, random_t* prnd)
{
double z[RAND_BUFSIZE];
int i, cnt, err;
if(!x)
return ERROR_PTR;
if(n < 1)
return ERROR_SIZE;
cnt = 0;
while(cnt < n)
{
i = cnt % RAND_BUFSIZE;
if(!i)
{
err = randu(z, RAND_BUFSIZE, prnd);
if(err != RES_OK)
return err;
}
x[cnt] = z[i] > 0.5 ? 1.0 : 0.0;
cnt++;
}
return RES_OK;
}
/*******************************************************************************
random generator of binary [-1, 1] signal
*******************************************************************************/
int DSPL_API randb2(double* x, int n, random_t* prnd)
{
double z[RAND_BUFSIZE];
int i, cnt, err;
if(!x)
return ERROR_PTR;
if(n < 1)
return ERROR_SIZE;
cnt = 0;
while(cnt < n)
{
i = cnt % RAND_BUFSIZE;
if(!i)
{
err = randu(z, RAND_BUFSIZE, prnd);
if(err != RES_OK)
return err;
}
x[cnt] = z[i] > 0.5 ? 1.0 : -1.0;
cnt++;
}
return RES_OK;
}
/******************************************************************************
Uniform random generator mrg32k3a
@ -122,6 +174,88 @@ int randu_mrg32k3a (double* u, int n, random_t* prnd)
/*******************************************************************************
random numbers generator of integers
*******************************************************************************/
int DSPL_API randi(int* x, int n, int start, int stop, random_t* prnd)
{
double z[RAND_BUFSIZE];
double dx;
int i, cnt, err;
if(!x)
return ERROR_PTR;
if(n < 1)
return ERROR_SIZE;
dx = (double)stop - (double)start;
cnt = 0;
while(cnt < n)
{
i = cnt % RAND_BUFSIZE;
if(!i)
{
err = randu(z, RAND_BUFSIZE, prnd);
if(err != RES_OK)
return err;
}
x[cnt] = start + (int)round(z[i] * dx);
cnt++;
}
return RES_OK;
}
/*******************************************************************************
Gaussian random numbers generator
*******************************************************************************/
int DSPL_API randn(double* x, int n, double mu, double sigma, random_t* prnd)
{
int k, m;
double x1[RAND_BUFSIZE], x2[RAND_BUFSIZE];
int res;
if(!x)
return ERROR_PTR;
if(n<1)
return ERROR_SIZE;
if(sigma < 0.0)
return ERROR_RAND_SIGMA;
k=0;
while(k < n)
{
if((res = randu(x1, RAND_BUFSIZE, prnd)) != RES_OK)
goto exit_label;
if((res = randu(x2, RAND_BUFSIZE, prnd)) != RES_OK)
goto exit_label;
m = 0;
while(k < n && m < RAND_BUFSIZE)
{
if(x1[m] != 0.0)
{
x[k] = sqrt(-2.0*log(x1[m]))*cos(M_2PI*x2[m])*sigma + mu;
k++;
m++;
}
}
}
res = RES_OK;
exit_label:
return res;
}
/******************************************************************************
Uniform random numbers generator
*******************************************************************************/
@ -161,47 +295,3 @@ int DSPL_API randu(double* x, int n, random_t* prnd)
return RES_OK;
}
/*******************************************************************************
Gaussian random numbers generator
*******************************************************************************/
int DSPL_API randn(double* x, int n, double mu, double sigma, random_t* prnd)
{
int k, m;
double x1[512], x2[512];
int res;
if(!x)
return ERROR_PTR;
if(n<1)
return ERROR_SIZE;
if(sigma < 0.0)
return ERROR_RAND_SIGMA;
k=0;
while(k < n)
{
if((res = randu(x1, 512, prnd)) != RES_OK)
goto exit_label;
if((res = randu(x2, 512, prnd)) != RES_OK)
goto exit_label;
m = 0;
while(k < n && m < 512)
{
if(x1[m] != 0.0)
{
x[k] = sqrt(-2.0*log(x1[m]))*cos(M_2PI*x2[m])*sigma + mu;
k++;
m++;
}
}
}
res = RES_OK;
exit_label:
return res;
}

Wyświetl plik

@ -0,0 +1,76 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "dspl.h"
/* Порядок фильтра */
#define ORD 4
/* размер векторов частотной характеристики фильтра */
#define N 1000
int main(int argc, char* argv[])
{
void* hdspl; /* DSPL handle */
void* hplot; /* GNUPLOT handle */
hdspl = dspl_load(); /* Load DSPL function */
double a[ORD+1]; /* Коэффициенты числителя H(s) */
double b[ORD+1]; /* Коэффициенты знаменателя H(s) */
double Rp = 1.0; /* Неравномерность АЧХ (к-т передачи на частоте 1 рад/c) */
double Rs = 60.0;/* Подавление в полосе заграждения (дБ) */
double w[N]; /* Циклическая частота рад/c */
double mag[N]; /* АЧХ фильтра */
double phi[N]; /* ФЧХ фильтра */
double tau[N]; /* ГВЗ фильтра */
int k;
/* рассчитываем нормированный ФНЧ Чебышева 1 рода */
int res = ellip_ap(Rp, Rs, ORD, b, a);
if(res != RES_OK)
printf("error code = 0x%8x\n", res);
/* печать коэффициентов фильтра */
for(k = 0; k < ORD+1; k++)
printf("b[%2d] = %9.3f a[%2d] = %9.3f\n", k, b[k], k, a[k]);
/* вектор частоты в логарифмической шакале от 0.01 до 100 рад/c */
logspace(-2.0, 2.0, N , DSPL_SYMMETRIC, w);
/* частотные характеристика фильтра */
filter_freq_resp(b, a, ORD, w, N,
DSPL_FLAG_LOGMAG|DSPL_FLAG_UNWRAP | DSPL_FLAG_ANALOG,
mag, phi, tau);
/* Сохранить характеристики для построения графиков */
writetxt(w, mag, N, "dat/ellip_ap_test_mag.txt");
writetxt(w, phi, N, "dat/ellip_ap_test_phi.txt");
writetxt(w, tau, N, "dat/ellip_ap_test_tau.txt");
/* plotting by GNUPLOT */
gnuplot_create(argc, argv, 920, 260, "img/ellip_ap_test.png", &hplot);
gnuplot_cmd(hplot, "set logscale x");
gnuplot_cmd(hplot, "unset key");
gnuplot_cmd(hplot, "set grid");
gnuplot_cmd(hplot, "set xlabel 'frequency, rad/s'");
gnuplot_cmd(hplot, "set multiplot layout 1,3 rowsfirst");
gnuplot_cmd(hplot, "set ylabel 'Magnitude, dB'");
gnuplot_cmd(hplot, "set yrange [-100:5]");
gnuplot_cmd(hplot, "plot 'dat/ellip_ap_test_mag.txt' with lines");
gnuplot_cmd(hplot, "set ylabel 'Phase response, rad'");
gnuplot_cmd(hplot, "unset yrange");
gnuplot_cmd(hplot, "plot 'dat/ellip_ap_test_phi.txt' with lines");
gnuplot_cmd(hplot, "set ylabel 'Groupdelay, sec'");
gnuplot_cmd(hplot, "unset yrange");
gnuplot_cmd(hplot, "plot 'dat/ellip_ap_test_tau.txt' with lines");
gnuplot_cmd(hplot, "unset multiplot");
gnuplot_close(hplot);
/* free dspl handle */
dspl_free(hdspl);
return res;
}

Wyświetl plik

@ -0,0 +1,178 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "dspl.h"
/*filter order */
#define ORD 64
#define W0 0.3
#define W1 0.7
/* Frequency response vector size */
#define N 1024
/*******************************************************************************
* function calculates filter frequency response and save magnitude to
* the text file.
* params: b - pointer to the transfer fuction H(z) numerator vector
* a - pointer to the transfer fuction H(z) denominator vector
* ord - filter order
* n - number of magnitude vector size
* fn - file name
******************************************************************************/
void freq_resp_write2txt(double* b, int ord, int n, char* fn)
{
double *w = NULL, *mag = NULL;
int k;
w = (double*)malloc(n*sizeof(double));
mag = (double*)malloc(n*sizeof(double));
/* Normalized frequency from 0 to pi */
linspace(0, M_PI, n , DSPL_PERIODIC, w);
/* Magnitude (dB) calculation */
filter_freq_resp(b, NULL, ord, w, n, DSPL_FLAG_LOGMAG, mag, NULL, NULL);
/* Frequency normaliztion from 0 to 1 */
for(k = 0; k < N; k++)
w[k] /= M_PI;
/* Save magnitude to the txt file */
writetxt(w, mag, n, fn);
free(w);
free(mag);
}
/*******************************************************************************
* Main program
******************************************************************************/
int main(int argc, char* argv[])
{
void* hdspl; /* DSPL handle */
void* hplot; /* GNUPLOT handle */
hdspl = dspl_load(); /* Load DSPL functions */
/* FIR filter coeff. vectors */
double h[ORD+1];
/*--------------------------------------------------------------------------*/
fir_linphase(ORD, W0, W1, DSPL_FILTER_LPF, DSPL_WIN_RECT, 0, h);
freq_resp_write2txt(h, ORD, N, "dat/fir_lpf_rect.txt");
fir_linphase(ORD, W0, W1, DSPL_FILTER_LPF, DSPL_WIN_HAMMING, 0, h);
freq_resp_write2txt(h, ORD, N, "dat/fir_lpf_hamming.txt");
fir_linphase(ORD, W0, W1, DSPL_FILTER_LPF, DSPL_WIN_BLACKMAN, 0, h);
freq_resp_write2txt(h, ORD, N, "dat/fir_lpf_blackman.txt");
fir_linphase(ORD, W0, W1, DSPL_FILTER_LPF, DSPL_WIN_BLACKMAN_HARRIS, 0, h);
freq_resp_write2txt(h, ORD, N, "dat/fir_lpf_blackman_harris.txt");
/*--------------------------------------------------------------------------*/
fir_linphase(ORD, W0, W1, DSPL_FILTER_HPF, DSPL_WIN_RECT, 0, h);
freq_resp_write2txt(h, ORD, N, "dat/fir_hpf_rect.txt");
fir_linphase(ORD, W0, W1, DSPL_FILTER_HPF, DSPL_WIN_HAMMING, 0, h);
freq_resp_write2txt(h, ORD, N, "dat/fir_hpf_hamming.txt");
fir_linphase(ORD, W0, W1, DSPL_FILTER_HPF, DSPL_WIN_BLACKMAN, 0, h);
freq_resp_write2txt(h, ORD, N, "dat/fir_hpf_blackman.txt");
fir_linphase(ORD, W0, W1, DSPL_FILTER_HPF, DSPL_WIN_BLACKMAN_HARRIS, 0, h);
freq_resp_write2txt(h, ORD, N, "dat/fir_hpf_blackman_harris.txt");
/*--------------------------------------------------------------------------*/
fir_linphase(ORD, W0, W1, DSPL_FILTER_BPASS, DSPL_WIN_RECT, 0, h);
freq_resp_write2txt(h, ORD, N, "dat/fir_bpass_rect.txt");
fir_linphase(ORD, W0, W1, DSPL_FILTER_BPASS, DSPL_WIN_HAMMING, 0, h);
freq_resp_write2txt(h, ORD, N, "dat/fir_bpass_hamming.txt");
fir_linphase(ORD, W0, W1, DSPL_FILTER_BPASS, DSPL_WIN_BLACKMAN, 0, h);
freq_resp_write2txt(h, ORD, N, "dat/fir_bpass_blackman.txt");
fir_linphase(ORD, W0, W1, DSPL_FILTER_BPASS, DSPL_WIN_BLACKMAN_HARRIS, 0, h);
freq_resp_write2txt(h, ORD, N, "dat/fir_bpass_blackman_harris.txt");
/*--------------------------------------------------------------------------*/
fir_linphase(ORD, W0, W1, DSPL_FILTER_BSTOP, DSPL_WIN_RECT, 0, h);
freq_resp_write2txt(h, ORD, N, "dat/fir_bstop_rect.txt");
fir_linphase(ORD, W0, W1, DSPL_FILTER_BSTOP, DSPL_WIN_HAMMING, 0, h);
freq_resp_write2txt(h, ORD, N, "dat/fir_bstop_hamming.txt");
fir_linphase(ORD, W0, W1, DSPL_FILTER_BSTOP, DSPL_WIN_BLACKMAN, 0, h);
freq_resp_write2txt(h, ORD, N, "dat/fir_bstop_blackman.txt");
fir_linphase(ORD, W0, W1, DSPL_FILTER_BSTOP, DSPL_WIN_BLACKMAN_HARRIS, 0, h);
freq_resp_write2txt(h, ORD, N, "dat/fir_bstop_blackman_harris.txt");
/*--------------------------------------------------------------------------*/
/* plotting by GNUPLOT */
gnuplot_create(argc, argv, 920, 840, "img/fir_linphase_test.png", &hplot);
gnuplot_cmd(hplot, "unset key");
gnuplot_cmd(hplot, "set grid");
gnuplot_cmd(hplot, "unset xlabel");
gnuplot_cmd(hplot, "set yrange [-130:5]");
gnuplot_cmd(hplot, "set xtics 0,1");
gnuplot_cmd(hplot, "set xtics add ('0.3' 0.3)");
gnuplot_cmd(hplot, "set xtics add ('0.7' 0.7)");
gnuplot_cmd(hplot, "set xtics add ('1' 1)");
gnuplot_cmd(hplot, "set multiplot layout 4,4 rowsfirst");
gnuplot_cmd(hplot, "set ylabel 'Magnitude, dB'");
gnuplot_cmd(hplot, "set title 'Rect win'");
gnuplot_cmd(hplot, "plot 'dat/fir_lpf_rect.txt' with lines");
gnuplot_cmd(hplot, "unset ylabel");
gnuplot_cmd(hplot, "set title 'Hamming win'");
gnuplot_cmd(hplot, "plot 'dat/fir_lpf_hamming.txt' with lines");
gnuplot_cmd(hplot, "set title 'Blackman win'");
gnuplot_cmd(hplot, "plot 'dat/fir_lpf_blackman.txt' with lines");
gnuplot_cmd(hplot, "set title 'Blackman-Harris win'");
gnuplot_cmd(hplot, "plot 'dat/fir_lpf_blackman_harris.txt' with lines");
gnuplot_cmd(hplot, "unset title");
gnuplot_cmd(hplot, "set ylabel 'Magnitude, dB'");
gnuplot_cmd(hplot, "plot 'dat/fir_hpf_rect.txt' with lines");
gnuplot_cmd(hplot, "unset ylabel");
gnuplot_cmd(hplot, "plot 'dat/fir_hpf_hamming.txt' with lines");
gnuplot_cmd(hplot, "plot 'dat/fir_hpf_blackman.txt' with lines");
gnuplot_cmd(hplot, "plot 'dat/fir_hpf_blackman_harris.txt' with lines");
gnuplot_cmd(hplot, "set ylabel 'Magnitude, dB'");
gnuplot_cmd(hplot, "plot 'dat/fir_bpass_rect.txt' with lines");
gnuplot_cmd(hplot, "unset ylabel");
gnuplot_cmd(hplot, "plot 'dat/fir_bpass_hamming.txt' with lines");
gnuplot_cmd(hplot, "plot 'dat/fir_bpass_blackman.txt' with lines");
gnuplot_cmd(hplot, "plot 'dat/fir_bpass_blackman_harris.txt' with lines");
gnuplot_cmd(hplot, "set ylabel 'Magnitude, dB'");
gnuplot_cmd(hplot, "set xlabel 'normalized frequency'");
gnuplot_cmd(hplot, "plot 'dat/fir_bstop_rect.txt' with lines");
gnuplot_cmd(hplot, "unset ylabel");
gnuplot_cmd(hplot, "plot 'dat/fir_bstop_hamming.txt' with lines");
gnuplot_cmd(hplot, "plot 'dat/fir_bstop_blackman.txt' with lines");
gnuplot_cmd(hplot, "plot 'dat/fir_bstop_blackman_harris.txt' with lines");
gnuplot_cmd(hplot, "unset multiplot");
gnuplot_close(hplot);
/* free dspl handle */
dspl_free(hdspl);
return 0;
}

Wyświetl plik

@ -0,0 +1,59 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "dspl.h"
#define N 100
int main(int argc, char* argv[])
{
void* hdspl; /* DSPL handle */
void* hplot; /* GNUPLOT handles */
random_t rnd = {0}; /* random structure */
hdspl = dspl_load(); /* Load DSPL function */
double x[N];
int err;
err = random_init(&rnd, RAND_TYPE_MRG32K3A, NULL);
if(err != RES_OK)
goto exit_label;
err = randb(x, N, &rnd);
if(err != RES_OK)
goto exit_label;
writetxt(x, NULL, N, "dat/randb_mrg32k3a.txt");
err = randb2(x, N, &rnd);
if(err != RES_OK)
goto exit_label;
writetxt(x, NULL, N, "dat/randb2_mrg32k3a.txt");
/***************************************************************************/
/* plotting by GNUPLOT */
/***************************************************************************/
/* Create window plot */
err = gnuplot_create(argc, argv, 820, 320, "img/randb_test.png", &hplot);
if(err != RES_OK)
goto exit_label;
gnuplot_cmd(hplot, "set xlabel 'x'");
gnuplot_cmd(hplot, "set ylabel 'y'");
gnuplot_cmd(hplot, "unset key");
gnuplot_cmd(hplot, "set yrange[-1.2:1.2]");
gnuplot_cmd(hplot, "set title 'randb, randb2'");
gnuplot_cmd(hplot, "plot 'dat/randb_mrg32k3a.txt' with lines, \\");
gnuplot_cmd(hplot, " 'dat/randb2_mrg32k3a.txt' with lines");
exit_label:
printf("Error code: %x\n", err);
if(hplot)
gnuplot_close(hplot);
/* free dspl handle */
dspl_free(hdspl);
return 0;
}

Wyświetl plik

@ -0,0 +1,56 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "dspl.h"
#define N 1000
int main(int argc, char* argv[])
{
void* hdspl; /* DSPL handle */
void* hplot; /* GNUPLOT handles */
random_t rnd = {0}; /* random structure */
hdspl = dspl_load(); /* Load DSPL function */
int x[N];
int err;
err = random_init(&rnd, RAND_TYPE_MRG32K3A, NULL);
if(err != RES_OK)
goto exit_label;
err = randi(x, N, -4, 3, &rnd);
if(err != RES_OK)
goto exit_label;
/* Save to file */
err = writetxt_int(x, NULL, N, "dat/randi_mrg32k3a.txt");
if(err != RES_OK)
goto exit_label;
/***************************************************************************/
/* plotting by GNUPLOT */
/***************************************************************************/
/* Create window plot */
err = gnuplot_create(argc, argv, 820, 320, "img/randi_test.png", &hplot);
if(err != RES_OK)
goto exit_label;
gnuplot_cmd(hplot, "set xlabel 'n'");
gnuplot_cmd(hplot, "set ylabel 'x(n)'");
gnuplot_cmd(hplot, "unset key");
gnuplot_cmd(hplot, "set yrange[-5:4]");
gnuplot_cmd(hplot, "set title 'randi example'");
gnuplot_cmd(hplot, "plot 'dat/randi_mrg32k3a.txt' with impulses");
exit_label:
printf("Error code = 0x%.8x\n", err);
if(hplot)
gnuplot_close(hplot);
/* free dspl handle */
dspl_free(hdspl);
return 0;
}

Wyświetl plik

@ -0,0 +1,74 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "dspl.h"
#define N 50000
int main(int argc, char* argv[])
{
void* hdspl; /* DSPL handle */
void* hplot; /* GNUPLOT handles */
random_t rnd = {0}; /* random structure */
hdspl = dspl_load(); /* Load DSPL function */
double *x = NULL;
double *y = NULL;
int err;
x = (double*) malloc(N * sizeof(double));
y = (double*) malloc(N * sizeof(double));
if(!x || !y)
{
err = ERROR_PTR;
printf("malloc error!\n");
goto exit_label;
}
err = random_init(&rnd, RAND_TYPE_MRG32K3A, NULL);
if(err != RES_OK)
goto exit_label;
err = randn(x, N, 0.0, 1.0, &rnd);
if(err != RES_OK)
goto exit_label;
err = randn(y, N, 0.0, 1.0, &rnd);
if(err != RES_OK)
goto exit_label;
/* Save to files "dat/randu_mrg32k3a.txt" */
writetxt(x, y, N, "dat/randn_mrg32k3a.txt");
/***************************************************************************/
/* plotting by GNUPLOT */
/***************************************************************************/
/* Create window plot */
err = gnuplot_create(argc, argv, 420, 420, "img/randn_test.png", &hplot);
if(err != RES_OK)
goto exit_label;
gnuplot_cmd(hplot, "set xlabel 'x'");
gnuplot_cmd(hplot, "set ylabel 'y'");
gnuplot_cmd(hplot, "unset key");
gnuplot_cmd(hplot, "set xrange[-3:3]");
gnuplot_cmd(hplot, "set yrange[-3:3]");
gnuplot_cmd(hplot, "set title 'MRG32K3A'");
gnuplot_cmd(hplot, "plot 'dat/randn_mrg32k3a.txt' with points pointtype 0");
exit_label:
if(x)
free(x);
if(y)
free(y);
if(hplot)
gnuplot_close(hplot);
/* free dspl handle */
dspl_free(hdspl);
return 0;
}

Wyświetl plik

@ -143,6 +143,9 @@ p_poly_z2a_cmplx poly_z2a_cmplx ;
p_polyval polyval ;
p_polyval_cmplx polyval_cmplx ;
p_randb randb ;
p_randb2 randb2 ;
p_randi randi ;
p_randn randn ;
p_random_init random_init ;
p_randu randu ;
@ -173,6 +176,7 @@ p_writetxt_3d writetxt_3d ;
p_writetxt_3dline writetxt_3dline ;
p_writetxt_cmplx_im writetxt_cmplx_im ;
p_writetxt_cmplx_re writetxt_cmplx_re ;
p_writetxt_int writetxt_int ;
@ -338,6 +342,9 @@ void* dspl_load()
LOAD_FUNC(polyval);
LOAD_FUNC(polyval_cmplx);
LOAD_FUNC(randi);
LOAD_FUNC(randb);
LOAD_FUNC(randb2);
LOAD_FUNC(randn);
LOAD_FUNC(random_init);
LOAD_FUNC(randu);
@ -368,7 +375,7 @@ void* dspl_load()
LOAD_FUNC(writetxt_3dline);
LOAD_FUNC(writetxt_cmplx_im);
LOAD_FUNC(writetxt_cmplx_re);
LOAD_FUNC(writetxt_int);
#ifdef WIN_OS
return (void*)handle;

Wyświetl plik

@ -261,17 +261,19 @@ typedef struct
#endif
/*----------------------------------------------------------------------------*/
DECLARE_FUNC(int, acos_cmplx, complex_t*
COMMA int
COMMA complex_t*);
/*----------------------------------------------------------------------------*/DECLARE_FUNC(int, array_scale_lin, double* x
/*----------------------------------------------------------------------------*/
DECLARE_FUNC(int, array_scale_lin, double* x
COMMA int n
COMMA double xmin
COMMA double xmax
COMMA double dx
COMMA double xmin
COMMA double xmax
COMMA double dx
COMMA double h
COMMA double* y);
COMMA double* y);
/*----------------------------------------------------------------------------*/
DECLARE_FUNC(int, asin_cmplx, complex_t*
COMMA int
@ -814,6 +816,20 @@ DECLARE_FUNC(int, polyval_cmplx, complex_t*
COMMA int
COMMA complex_t*);
/*----------------------------------------------------------------------------*/
DECLARE_FUNC(int, randb, double* x
COMMA int n
COMMA random_t* prnd);
/*----------------------------------------------------------------------------*/
DECLARE_FUNC(int, randb2, double* x
COMMA int n
COMMA random_t* prnd);
/*----------------------------------------------------------------------------*/
DECLARE_FUNC(int, randi, int* x
COMMA int n
COMMA int start
COMMA int stop
COMMA random_t* prnd);
/*----------------------------------------------------------------------------*/
DECLARE_FUNC(int, randn, double*
COMMA int
COMMA double
@ -948,6 +964,12 @@ DECLARE_FUNC(int, writetxt_cmplx_re, double*
COMMA int
COMMA char*);
/*----------------------------------------------------------------------------*/
DECLARE_FUNC(int, writetxt_int, int*
COMMA int*
COMMA int
COMMA char*);
/*----------------------------------------------------------------------------*/
#ifdef __cplusplus
}