|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 % l; e3 U% I- G) V0 W6 X: d( n# y# m
; p( I, f; O; q, l+ }, _1 v各位大神:& I/ y& }' F: Q0 H1 g w2 S- N
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)( \6 h" i: A1 X5 F" c
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:- r: f% q% A6 [. z4 k; J& ~) n
6 K3 u/ {4 L2 C0 g! r( x9 n9 Y% M
+ O M3 J, c. Y4 F+ Y8 D这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
4 J0 k: _# k% X: | I/ {) \
0 J; S( ^) h0 E' i' x1 b. w并没有其他线程
. Q( |! Q4 O2 k+ L9 F7 r- `& Z反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。% a# {# y* G4 q* M6 D
也说不定是和堆栈有关系。。。。。。
b/ p+ G" F. b) H请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
; r p0 h2 A; V" _- \; ~
; J" J/ `7 c4 s+ f0 i& ~* B7 R
8 F) J8 m" G5 T& n3 G( n+ o+ E' d% X; k
我也很绝望啊,希望大神能帮帮忙,感激不尽,!
) |% y$ X( T0 ?0 Y0 ` y; W9 q- z
6 `& Z8 m; P$ ]$ W2 y% L+ s$ v附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];' Y$ b/ A) ~) [+ X3 c" S
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
2 ^7 U. p0 n5 P( F3 k$ ]2 d/ n2 N: d, W, C, s5 e
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(. d2 b; E6 ^( o' G3 g9 [: \, r
const double data1000[1000]) {, N, A+ A8 j5 ~, g q$ ]! D$ K
Y; a7 ^% R" e+ o* b# c int myfuck;( s9 g. Y* r' Z# r
double yiDuanShuJu_mean;) L1 J5 _8 C4 z+ n
double yiDuanShuJu_LowMean[1000];
, \. X4 o) e+ \% s int ixstart;
# N3 Y6 [( `, A. i- _" C double dv0[1000];4 K0 X8 q, j' ?. r7 v3 i7 @) B% q
comm_AGC pAGC;$ Q7 H% D4 `0 [! S) m$ a- q
comm_CarrierSynchronizer pFineFreqCompensator;9 `1 X& j" J9 ^; c1 y
dspcodegen_FIRDecimator pRxFilter;3 f$ N; z4 q' G( O! U. H u
comm_SymbolSynchronizer pTimingRec;' Q$ q$ \1 j* Q" |
comm_PreambleDetector pPrbDet;
4 n8 b* W% W% V/ l FrameSynchronizer pFrameSync;
& _( R e3 v$ h7 W4 P QPSKDataDecoder pDataDecod;
3 W8 \7 }, a+ J static double usable_left_filtfilt[81000];
* c' r9 {3 Q; O' A/ @( ^ static double youXiaoShuJu_QuZhiLiu[81000];( t. c+ z1 h8 \" J( _$ n0 Z1 k
double mtmp;# a, q, f, z. _$ y
int ix;0 t( j" P) X3 d' s
boolean_T exitg2;0 z( t$ [! g9 m8 i4 g
boolean_T exitg1;5 P7 m, H( V" l) S& J
double YiZhenShuJu[800];
5 B% D0 U% C/ ^ double dv1[800];
# i8 R* \. M2 @) X1 y3 T* C/ D, S$ a: ` @/ a" \9 e+ I. y" I
3 h. w! i e; V+ [
double b_YiZhenShuJu[800];$ U9 m- N% n% K, a
double I_filtfilt[800];
% v) G/ W* v! u8 a: ~ double Q_filtfilt[800];$ u$ d9 V7 D2 z
creal_T b_I_filtfilt[800];. d( u7 a" H* }# W$ J, W
creal_T b[800];
$ \: v5 H: T. i: H2 T creal_T RCRxSignal[50];$ c) a) J2 V; D! H$ \
creal_T fineCompSignal[50];
4 t3 C. V- Y- y& }6 x2 Y; U, R) \ double phError[50];% Z" w0 F0 l% B2 |- {
creal_T timingRecSignal_data[28];. S1 [3 e% P( n0 ~
int timingRecSignal_size[1];8 j% C5 j9 b( t, Y
double prbIdx_data[28];; L* _" Z- Y( Q2 s% ? c6 R
int prbIdx_size[1];
* _, `1 L( B, R2 |+ M- A double dtMt_data[28];
- ^. t/ u k7 v. m! V0 x int dtMt_size[1];2 V& n b5 w9 K% Q0 L
creal_T symFrame[25];
1 k/ W: Z$ q' _ boolean_T isFrameValid;' R" @6 G7 ^/ K2 K9 Y& Z
double unusedU0[3]; B3 i, S* b' Z
& z, s( V# {" j+ S# H0 ^7 K {4 S
//调试过程中的变量; `6 {( c4 l0 }1 x# J
int enough_data;
( b" Z' c9 F& H1 c; R9 M2 {: S6 M* b+ ^- M# r+ a' u( t
int enoughDataFlag;
* D& U' A7 r2 E! T( ]. j1 K/ w6 P int yiDuanShuJu_mean_int;1 V) f/ ^& H: @6 D' Y
int int_sum_dv0;
% d9 Y3 u3 ^$ c6 \- x int oo;
7 D, n1 w% K$ y9 J int ii;
6 v4 P" N- W# A s7 E9 n. R; z8 t& g myfuck=10;
& E1 a% Q4 c7 f# |) o /* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
t$ l/ {- C% h+ k, |" K! [8 L0 P /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
/ `" C f9 O: }2 h5 Y0 Y
$ `& X$ T: V# ~0 Y- ]2 @0 Z yiDuanShuJu_mean = mean(data1000);. e! L6 |5 Q% ^
5 Q1 L: B% y+ M0 F yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;( A% b5 I2 n& e
UARTPutc('A');
. ]+ T* M C2 {; B$ N UARTPutNum(yiDuanShuJu_mean_int);
+ w' U4 R1 [; u% ?6 X UARTPutc('\r');3 e Z4 O) [1 T1 A" X
UARTPutc('\n');
! D, X! F$ J E: @* k4 ~1 b& C% T& F( y- H
for (ixstart = 0; ixstart < 1000; ixstart++) {
_& I; V! S% k0 y6 W yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;* k" @! ~6 ^5 w7 g7 n7 D
}
% \/ P6 y9 s+ _+ \/ ~8 D2 B- O+ b V- Q$ X
power(yiDuanShuJu_LowMean, dv0);7 T3 F. V- P% O/ s
8 e6 w: i5 ]# V int_sum_dv0 = (int) sum(dv0);+ ~7 q, M/ ^+ P" n
* X* k4 c1 O$ n' h$ l2 T3 w UARTPutc('B');
8 N' t& z( [3 W8 n UARTPutNum(int_sum_dv0);3 I0 c/ P8 N1 L4 ]: O% S
UARTPutc('\r');0 \5 m- M% L* k. g
UARTPutc('\n');
, u j' h+ T5 F' b7 u0 @/ G9 b) V: K B) k0 ~1 i1 z
// int compareFlag = int_sum_dv0 > 1.0E+8;$ S) a' O: y( B2 Z9 s$ J) K
- I% Q6 q8 o% x% m8 o% U if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?" G9 j' g; T" I. u
UARTPutc('C');2 W% Z8 T4 W: Z6 I
/* 比较信号能量 */8 j6 L8 j& s& t9 ~* B/ V
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */: l. ~1 T# f, J. L3 s, l- P
// yiDuanShuJu_mean = 1000.0 * youxiao_k;
; L4 f9 E3 P' Q ^// for (ixstart = 0; ixstart < 1000; ixstart++) {
, |2 \0 j4 [1 A# x5 J// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
% ?5 ^2 |) n) E$ V! T) P// yiDuanShuJu_LowMean[ixstart];( B" c9 T, j% b& D# g( _; b4 x% O
// }
! S6 r# p- W# Y1 U) {5 L// @+ w Z3 t2 h. w$ Q+ D- ~0 |
// youxiao_k++;5 S( {# l/ m& i6 Y$ q6 R% \8 t. b
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==$ O1 m9 ?, {2 p2 l" G
// /* 感觉要取21个数,即0-20, */
( |7 b8 N7 g: Y2 m# ] U( D// enough_data = 10;//有效是10,无效是0
! D( p6 E2 ]0 m: m0 @7 H& n6 y// }
( L) I& g: U, \$ K8 p! g8 @3 J }
o ^% \" X- W5 v5 U8 [
8 m1 ^2 r- p( c' D; H
5 z% G5 {4 e4 K) ]9 w enoughDataFlag = 100;& ~5 m) ]) V5 F' _3 D5 e- Y( u
enoughDataFlag = 1000;' B6 [- U$ M- u' b4 \' v2 f
enoughDataFlag = 0x02;5 E- E& Y3 ~0 `2 s* @9 U! L
enoughDataFlag = 200;& \+ p" g9 }7 D; B D! M* J3 D+ v
# C- z/ A4 n- z/ ?2 s6 F int myfuvk1;
+ A" F+ |1 j/ B, d, N3 }; s- m myfuvk1 =11;
6 N5 L, n5 V9 @7 S* {& Z( m$ N/ U. w8 v- W; ^' Q: m" {) l
8 {9 P' j/ K* N4 P6 \ enough_data = 0;# c7 U4 |7 k* q5 P5 o# h
% L0 K7 H/ _6 f4 ^" c8 |# m6 j
// if(enough_data>50){6 z! v+ F, _+ U2 Y0 U/ H
// enoughDataFlag=0x01;
& x1 }( z- @# ?8 Q) T2 C0 S// }else if(enough_data<50){8 Z5 o, D( z6 X; v0 w
// enoughDataFlag=0x00;//0x00还是不行
; N! ]- Q3 ?% w+ r/ A/ X// }
4 a! s& F d& D% F- d% {. z) M) |6 s: C8 [# e. B
2 W$ @: g% i( O; H0 S3 O
oo=10;. X+ d( D$ \1 g: n8 h
oo = oo < 5;
% [, l) c/ v; c3 v) c0 Q) p if(oo){
/ k& h, U1 ^( F) a" a# \' k ii=0;
' y* z# `, R2 ?5 J }
" x& k3 s$ i R& d" T if(oo < 5){" V2 W$ X- U+ w2 N$ a
ii=0;
! O* p5 W4 O3 ~8 k' H }% U9 Z& f3 f( W% n8 C) K/ O
if(oo > 5){
7 I& t6 K4 n E& D ii=0;
4 y/ J. d4 Z: @6 g; g }
9 I( t; X# ]! l$ U8 O$ w T7 Q- [! ~+ u7 r. x/ b* w
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */. u" r" Y ?1 x a' G
/* 如果数据足够才执行主程序 */ [. ~5 Z' B$ t$ Y8 Y4 Q- L
oo = oo < 5;2 D# F2 a! ?* \- {4 t8 y2 d: \7 C/ X
enoughDataFlag = enoughDataFlag < 5;, g! C5 Y& a, j6 T3 L$ d+ v# P
if (enoughDataFlag < 5) {
$ u( f7 y+ ^/ |0 f// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
7 y5 i7 ?3 K) S Z( b AGC_AGC(&pAGC);. Y3 \4 a# A C; {
* O9 H0 Y( C( M* J* _, n9 r c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);% @/ G( t! p# G( Z/ U4 h/ s
FIRDecimator_FIRDecimator(&pRxFilter);1 y* x" f9 P, @0 T. `1 ~6 f
/ `- \& a# m1 }4 v; d /* Downsampling */
6 u0 |0 C2 j w, ] c_SymbolSynchronizer_SymbolSync(&pTimingRec);
. j$ v y9 w0 D" W3 l' D! {9 d4 ~) D' c' n6 s W! F$ I. @
c_PreambleDetector_PreambleDete(&pPrbDet);
3 N2 y; g# v! [
) Q+ K& k; _3 e7 X /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
: I4 }$ c2 |; m6 v+ _! ` /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
7 ]; L, [8 f' j5 [( [ /* %帧数量=100 */
8 p6 Z: x7 I. P1 d: G4 P4 D, \ pFrameSync.isInitialized = 0;# D2 s& h _( q6 T& d7 a
& J0 Z" M; b3 A+ ~" ` /* [EOF] */* V, Q( ?. B8 [6 m" s+ k- g# T
/* 前导码长度是13 */- _: a* |9 D1 z9 @
/* %qpsk */9 d' T4 {# D3 v3 }% ?) X
pDataDecod.isInitialized = 0;! _* V% g# ?9 r5 g" D" y% z; f! Y4 O
% E ^( ^& L8 B6 |2 N o /* end */
, F* A5 w3 g+ b6 B /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) *// o4 D1 {9 Y4 X1 V0 ~& Q. B
/* Convert 3-dB frequency */
) y9 c& g( k- }( ]7 B /* Convert 3-dB frequency */
4 W! [, ]) |; n! ]( ]2 b) Q' V filtfilt(save_buffer, usable_left_filtfilt);
2 m' {9 F' f2 C/ w# c for (ixstart = 0; ixstart < 81000; ixstart++) {
1 Y# g" F0 d3 T- l! N usable_left_filtfilt[ixstart] *= 2.0;2 U& ]/ |! a4 [8 `. y) x. B
}
) Z2 P8 U. S& y0 \) d
/ B- K) X8 g P /* 注意乘2,处理幅度 */
6 m! q) r. r) o) P; D9 h /* %% 我发现带通之后其实就均值为0了,不用这一步了 */) v4 D$ P# e/ Q8 e* c' ]+ X: [$ {
/* %% 行列转换 */! m0 f# U1 K3 E x/ H# S
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
4 I& A" ?+ }* B S for (ixstart = 0; ixstart < 81000; ixstart++) {
" t( n1 u& Q7 M4 L4 g2 Q youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
% \% i0 H& m2 a3 C - yiDuanShuJu_mean;
% t& f9 ~) [* P6 C# | }1 I9 R8 V1 T4 `' q# F5 O
$ {5 {% w9 \7 C' _7 U /* %% 应该对数据归一化,但是这一步放在哪比较好 */
@5 a* G4 D. ^) \3 D( O ixstart = 1;
: n% [ F; m7 X mtmp = youXiaoShuJu_QuZhiLiu[0];
2 @! u9 ^$ S. r7 H if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {! f! u3 w8 l0 F3 r/ p) {# I
ix = 2;! v% s$ O. j. @0 m% ]3 d$ v
exitg2 = false;4 d( X5 c% V; C) w/ d
while ((!exitg2) && (ix < 81001)) {" u5 h7 l! M! e0 Y
ixstart = ix;
& n- \- T. w" K, ~+ r9 `" z if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {7 b2 w% d& \0 P" W# r
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];# A; z: U7 s: @0 ]5 n" q0 O
exitg2 = true;0 l0 k+ X# T1 `; Y/ B
} else {
' ]7 d/ g: ^' w Z& W B ix++;
' D a0 r! y }" R- ^ }
) Q! Z* u1 l2 I, b) G1 i0 n' _9 I }. N$ W3 B0 u8 o- O) G8 C
}
, o6 B% X0 p( r" y1 A8 t9 @$ @) X! Q1 I% t( \1 R) O
if (ixstart < 81000) {7 Z1 K2 T8 q* Y8 e! c
while (ixstart + 1 < 81001) {
! s6 F3 {& s9 W" g$ S8 O if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
9 V& F& C2 _3 \2 K d7 f/ ? mtmp = youXiaoShuJu_QuZhiLiu[ixstart];3 l2 M9 A, S9 K- D* |
}. J$ m6 W( ~" _! k
* ~- P3 q, h- L0 \- ]% w3 F+ a ixstart++;
) o& a# C! \/ H( y' J }. |! i6 \; | m; D2 s; H' ?: |) ]
}0 e: Z3 l/ F. g( K0 G) P
" J7 a1 p) P% `* h% r, G1 L ixstart = 1;: ^& G0 R0 c4 [
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
7 }) @, O9 x/ h, }* l if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
( X0 t9 H( J. R4 {7 `# O ix = 2;% Y4 G; ^) e) O' p" o
exitg1 = false;
n8 ~* U- I1 W0 O( f$ ~ while ((!exitg1) && (ix < 81001)) {; A# ]- Y/ s" o
ixstart = ix;
1 j, c/ g# Q+ y& G( c if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {! d' _1 G: {$ ^# l! D9 F. F1 a
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
; q* [: W _7 D exitg1 = true;
4 v2 e$ d$ r, }3 \9 P } else {
, Q# X, B- L' }; ` ix++;
S3 U( m% ~( u9 h; m; E1 k( p: u }
' J, T5 U- y9 X, X, g: ^+ ^ }
0 S2 |$ h- W) r% a }2 G. A- t/ M* Z+ W
& r) ?' v/ ~- E# L- p9 g
if (ixstart < 81000) {1 t( {; g; g; L. K$ b/ `$ ?
while (ixstart + 1 < 81001) {& [: d9 J* x# s5 P7 \$ n n& z* Q
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
* F1 S! Y. v9 c8 M yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];5 m, a4 c& }& _+ c1 D2 \
}& _) E8 p6 f. Y
& }7 N0 J$ k4 W2 l) | ixstart++;; \+ [6 H, A# U# g. [
} P) E9 p' o7 x4 U7 c
}
. B! T: i" c$ j4 W! `& b& c
1 c4 d, i, X5 D" C4 X: J$ U1 o P yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);5 f0 V( M7 | k# V; H
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {9 ]4 e6 h* `8 W
yiDuanShuJu_mean = mtmp; {+ T6 ]8 W* ]2 o3 f
}( c$ s' H3 w! x/ V# U+ ?3 l
& o/ }6 @& W7 i. N& F% E! s
/* 找出极值 */) s i7 K2 e7 Q% g$ e
for (ixstart = 0; ixstart < 81000; ixstart++) {0 {4 ~/ @/ e8 E: E
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;! z! z& E5 l! c0 V) p8 @
}/ z `7 t7 J9 X9 w8 f9 e
5 J& C5 F7 w, Z/ c4 c --------------帖子字数限制------------------7 A" Z% [& p4 H; p6 @% I
}9 ]6 f n$ q* d1 @# U1 G* r
: i" T5 G+ i+ X, E1 |9 R
. ]8 ], F, W+ B/ n2 U/ `. L* J |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|