|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 1 n( ]" Q7 G% A# u! F8 O
+ `! E/ L% a4 H各位大神:2 C0 A& H: I+ U2 r* R# R
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)8 V( W/ a/ i) Z# P( t) ?* T! p
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:9 a' C+ o* t3 j
/ R: I' U. z$ u( c% u/ T) d 0 ~! n/ ^" B: @: S* n6 v/ W
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。- v7 v; I$ } F
5 Z- K( I+ t5 }4 _并没有其他线程
+ e' b% B) f4 y8 J4 u9 G% ?反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。( s) D7 g! b4 m8 a7 }8 k2 B7 w
也说不定是和堆栈有关系。。。。。。
/ Z6 E' [; V# m/ B请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
5 Q. d! }4 o: Q" k6 E, ]% `2 }2 [( y1 A4 @ E4 N
9 J8 w9 q+ L' n( V9 K, L) }# @4 F3 L* V
我也很绝望啊,希望大神能帮帮忙,感激不尽,!+ s# ?$ ]' I% y/ \4 R6 j4 M# ?
; G! p& ~* F) L" y) L5 d
) i0 I0 B7 V% l: r4 p附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];# k) c- J6 h' f- R
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。6 W$ c) a' x1 d8 ]3 O' G$ u2 u
% x- E2 [4 J. n1 gboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(, H7 s1 T6 s. h5 m
const double data1000[1000]) {
! U5 n: a9 P+ \1 W) M3 A( C n( U( m% c4 ]3 n* d( H
int myfuck;
" `: q4 V9 j& `$ P double yiDuanShuJu_mean;# i# I4 M: b: C+ i: d5 q
double yiDuanShuJu_LowMean[1000];
& ^ G! B: a( O6 e6 b int ixstart;
% f8 V1 _) \/ U0 M& m double dv0[1000];
; A. V2 A; p( b comm_AGC pAGC;
6 y- P) G1 s# n! u' y comm_CarrierSynchronizer pFineFreqCompensator;4 m9 ]1 V) J7 V) |
dspcodegen_FIRDecimator pRxFilter;
% p& K2 N, F2 S* V+ D) y. p comm_SymbolSynchronizer pTimingRec;
8 m z. w. R* C$ H comm_PreambleDetector pPrbDet;
8 `. R3 V! H- V- P0 [0 E/ [5 {0 n FrameSynchronizer pFrameSync;- N0 x7 ]; C+ L* ^( p! S; f1 u
QPSKDataDecoder pDataDecod;
+ Y8 d, O2 r5 ^ static double usable_left_filtfilt[81000];
5 C1 Y' D: V% T$ O% b/ L static double youXiaoShuJu_QuZhiLiu[81000];
3 V0 F1 p+ J. [, c double mtmp;/ x) j( [; }4 |2 t, k9 c- \
int ix;4 G' i, |8 G3 f: V! p+ Z% s ^
boolean_T exitg2;5 p8 H! o' a! B
boolean_T exitg1;
8 |6 z: Z4 Z9 K4 p1 _7 J8 u: z double YiZhenShuJu[800];1 Y( Q: N2 k b+ R, i
double dv1[800];
7 J3 k- O; j; U- P
: _$ G7 \ q. L p3 ~ E
; W( z9 p0 X6 D8 w& t( z. D double b_YiZhenShuJu[800];
8 b; v D, H" H double I_filtfilt[800];. D; ~$ G- \6 N" |6 C F2 B" s
double Q_filtfilt[800];. K& c9 O% N/ p0 y# S3 L( b. o
creal_T b_I_filtfilt[800];
, o. P4 t {8 T6 q5 J5 B5 I6 ]2 t creal_T b[800];# {- d5 H3 G2 F7 _$ P
creal_T RCRxSignal[50];8 }# T( T9 ?& P# b9 J1 P8 L
creal_T fineCompSignal[50];9 f7 Q) p! t9 @. x! }9 Z5 r
double phError[50];
# q2 x- d* Y3 L8 r! m creal_T timingRecSignal_data[28];# S+ _1 ^6 r" c( j$ o0 a
int timingRecSignal_size[1];
+ U* |6 L; U! [; H2 E+ r _5 J" x double prbIdx_data[28]; H1 ]; ^# \4 h8 a Q: [1 Y# ]4 m
int prbIdx_size[1];# M4 u5 O& H& E! R9 H
double dtMt_data[28];
* S# p! v$ S& m$ \& V2 F int dtMt_size[1];: H$ f! I3 i+ o: \$ Z
creal_T symFrame[25];
2 u1 G% j4 f1 u; C1 U D3 D. ~ boolean_T isFrameValid;
8 a+ c$ p2 d6 B) v8 R; e double unusedU0[3];, H$ f; [) n8 B6 S H
4 w) s+ K9 k$ n2 D+ i- n/ ~' c //调试过程中的变量
, W: ?! F x: \8 k: ~; W0 q' f8 O int enough_data;
& n, @3 ? \8 r" c" x( m0 B5 s3 [( K/ ]9 |( |/ `
int enoughDataFlag;' p# W- R7 \/ h- X- X: \
int yiDuanShuJu_mean_int;
0 Z6 I1 N. z* F1 S/ L int int_sum_dv0;% j0 E& }+ \. R5 {
int oo;. P3 R& `1 L* I( H) i, Y
int ii;2 c9 J0 c$ [% v! S
myfuck=10;. ~5 Q% M$ g6 r3 m. O9 z
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
; F- A; Q$ L) ~# H3 @ /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */( j% b3 q# W7 X f7 @- H, z, `, v& |7 a
- H! }! @! o" u/ u) t$ ?( ` yiDuanShuJu_mean = mean(data1000);# Q7 w4 M6 w) C9 R9 [( q9 G" }
* Z6 r4 f: t, N6 G, {8 N z+ c: R: o# N
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;3 u5 V" m- w6 }: _/ C8 ]. Y
UARTPutc('A');
2 D' i, v# Z3 Q" O UARTPutNum(yiDuanShuJu_mean_int);; s# Y6 D7 C" V8 V
UARTPutc('\r');. {! K: J; a4 ]- C7 y
UARTPutc('\n');9 B2 c- u4 ]( p4 G9 K6 _
. e* n( Q) N) j) d' u0 [+ l) j- L
for (ixstart = 0; ixstart < 1000; ixstart++) {& c9 U3 }) H; K3 q
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
' ]" u c5 ^+ E% C: u }
2 x6 D+ c9 ~( P* H; D! y: N3 f; p Y( b) A L+ n
power(yiDuanShuJu_LowMean, dv0);
* a& x" q- c* m" j9 G
& A( r! P9 g# w+ {) F) q int_sum_dv0 = (int) sum(dv0);
+ |6 f: J: c p" G. {
) Z) b- [ F& G) | UARTPutc('B');' R7 r' g! Y2 s* s; c6 ?* z
UARTPutNum(int_sum_dv0);& u# ?) o2 _- Z0 D6 V/ H( |) n
UARTPutc('\r');
. f& Y: H/ X. @0 i5 `+ }$ f% E UARTPutc('\n');4 W% H) D4 `1 h9 ]
, h7 |2 F% Y* Q% z9 T// int compareFlag = int_sum_dv0 > 1.0E+8;
, ]: t6 M6 M( R- A% s7 j8 d2 P+ A/ Z- t7 i
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
) v1 P6 P' |& ]6 }) _8 ~; ?! l UARTPutc('C');
% W U- c2 u/ Q /* 比较信号能量 */2 w. l0 U% s' v
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */8 F/ _) k( i7 w# L9 a8 Z2 w" {
// yiDuanShuJu_mean = 1000.0 * youxiao_k;
9 N( H/ c7 d8 ?# ~// for (ixstart = 0; ixstart < 1000; ixstart++) {' p: ], r8 @3 |: @
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
5 h8 _2 Y/ ^6 `6 [& E// yiDuanShuJu_LowMean[ixstart];
" m6 |; e* d$ C) u// }+ q5 Q$ @, b2 x" ^4 E0 `- Z8 d
//0 U, d4 N% ^5 |4 n) c
// youxiao_k++;
7 e/ _# P' S% [, {) o# n/ r5 p/ u// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
) ?1 w: a5 ?9 e9 a; d# W// /* 感觉要取21个数,即0-20, */
: q) M4 h: H4 b, j// enough_data = 10;//有效是10,无效是09 U8 W, a) b7 v# ~1 t; @
// }
4 c9 Q% J: P- D# t6 M }) V% W3 L6 ^" c4 F6 P
D1 Q- d- {) a; w; `# [
+ I X6 G1 z' d/ g
enoughDataFlag = 100;$ `! l% }& R* X, g
enoughDataFlag = 1000;1 \! [6 B) B$ S# g
enoughDataFlag = 0x02;
9 r# ~8 X# P. S enoughDataFlag = 200;- I: e% J: N$ H
6 Y0 L# g4 N5 z1 { int myfuvk1;8 [1 S9 Y+ d2 S4 ^9 z1 M' [
myfuvk1 =11;$ Q" X3 M% Q k- }+ N! @+ U
5 \3 B7 `, Y5 P7 Z( c5 d
8 B2 H+ h* u5 l3 x& K9 U* ~ enough_data = 0;8 \# ?# f$ O1 G) Q; p0 E2 j
, e9 _0 |' K; G2 r& D$ E. W
// if(enough_data>50){
, ~6 I, e4 ]: C/ N3 x1 P7 y2 N: o// enoughDataFlag=0x01;0 q# @; I4 Q8 {" {- z: m
// }else if(enough_data<50){
- {& q4 w0 C/ x. R// enoughDataFlag=0x00;//0x00还是不行 ]( }& E4 \; v$ @0 I; v& `6 M" F; H
// }
" I0 [+ V# `& ~
: y( F: o7 Z4 V% t1 E& E5 {/ q( e! d& M
oo=10;8 R. O8 T d" d0 @) Q7 i' | V
oo = oo < 5;
0 U- _6 }7 X4 I1 f+ T if(oo){4 T4 x$ H0 M2 p& N, C
ii=0;! x$ H& q9 V' j9 L& A) K
}
7 {) e$ d' i8 q# s. G if(oo < 5){
' U" \4 e) ~' ? ii=0;
8 X( ?& w+ m8 {2 k }
! [9 ]0 [5 |# J& o& b& c if(oo > 5){
. m5 o1 n$ B) C0 R ii=0;
1 w8 {& Z8 G6 {2 p# T3 X }
7 F' g) h D" W/ t; J t; a8 ~4 T( `7 @0 ^! M
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
% R% Q& F$ K& F /* 如果数据足够才执行主程序 */
' \0 @3 h: ?% Y. O oo = oo < 5;
4 {# ]1 @5 W" H0 m( R enoughDataFlag = enoughDataFlag < 5;* f. D) \/ T5 }2 Z7 z1 F
if (enoughDataFlag < 5) {4 P' A3 ?. C& J7 r2 i
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0* I6 _3 V. V0 Q% V v# y: Q3 v
AGC_AGC(&pAGC);
3 p+ E( |5 |$ O
) G# t2 A! _6 T6 d, C' A c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);+ V A1 E, D2 D9 z5 p1 W7 D/ @
FIRDecimator_FIRDecimator(&pRxFilter); p0 ^6 `5 w% y7 D, i: E
" M7 k1 d! h6 b% ]9 E8 r, | /* Downsampling */
3 K. w$ s9 h! W( @" l" Z( g c_SymbolSynchronizer_SymbolSync(&pTimingRec);0 b! ^! Y/ @$ y4 p# P
7 i* O9 e4 G7 S8 a( A i6 W c_PreambleDetector_PreambleDete(&pPrbDet);
# ^2 {- D1 F9 O6 ^" `- F \ U3 I/ X$ R6 s2 l8 J
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */# a$ K5 ~$ a# q' n* @0 q
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% *// b X8 Q g+ G; [7 z- [; O
/* %帧数量=100 */* z! @3 Y8 V" M. d( j. c% Y
pFrameSync.isInitialized = 0;9 b5 ]7 ?7 D" q$ t
- @1 H. T4 {" L1 m /* [EOF] */
# P4 r6 Y+ Q2 x8 S+ e /* 前导码长度是13 */
1 z: e, Q: a* Q" `, i6 k7 C* P w# Q% H /* %qpsk */
! h( a/ e# E% T% [! B pDataDecod.isInitialized = 0;
' x7 }: b3 P% D8 m4 K% `6 w2 N
+ B' R) X" j: z; z /* end */7 g: ^& }( P9 c; c
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */- [+ H z/ o' D4 H. q! k
/* Convert 3-dB frequency */7 |/ C" d3 e' j3 q9 ~; a7 d
/* Convert 3-dB frequency */
9 Z$ O9 k0 u) d. Z filtfilt(save_buffer, usable_left_filtfilt);
3 Z F3 F, G% j0 a0 V4 m/ {- O2 k% t5 f for (ixstart = 0; ixstart < 81000; ixstart++) {
+ l$ N1 u7 u( {/ w. x usable_left_filtfilt[ixstart] *= 2.0;: }, z0 y8 t6 o
}
3 `& A+ i; o3 l- F2 D& y1 o5 \. }; }. H& v% Z: b2 d+ d
/* 注意乘2,处理幅度 */
! N) `7 T: X# W; }0 k) P /* %% 我发现带通之后其实就均值为0了,不用这一步了 */
: s3 {' R& V+ Q# x( a7 K7 {/ O /* %% 行列转换 */+ U- F5 l0 l% ~' p
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
. r4 K/ j% E* H7 m2 o for (ixstart = 0; ixstart < 81000; ixstart++) {6 Z4 Z8 z7 X' X) Q
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
9 k* s/ e4 }2 ]3 C% m - yiDuanShuJu_mean;7 ~, M6 [( b, L: m1 H: b
}7 u, X; O8 ^0 b
e! V: S9 u/ L$ f+ m+ r0 A) p4 F /* %% 应该对数据归一化,但是这一步放在哪比较好 */
9 O6 |, Z8 U" Q( V ixstart = 1;" C" p U. o5 V& I+ l6 y& w) g
mtmp = youXiaoShuJu_QuZhiLiu[0];
' R9 n, U" Y1 k, h( }8 V/ n if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
8 w6 A& V4 x# Z+ K+ J ix = 2;
1 w! h/ ^7 K1 l, J exitg2 = false;$ g, N! V: P5 e% Z
while ((!exitg2) && (ix < 81001)) {
# \: }; R& `+ v' Z' P2 {- M' K ixstart = ix;8 Q, y1 J- P/ C1 Y
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {) l. M* z, p$ d2 ~0 {- r! n- s, Y$ A
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];( c# e4 H9 j" K2 T$ W) `$ I
exitg2 = true;
7 B G' q+ o2 c% d5 n: q6 l! U6 }0 W } else {: E* t* G0 \0 p% }
ix++;
4 r/ l! ?, f; ~, E6 |9 h* u/ { }, C1 x! n1 r( o5 }: |
}
5 l6 ^& n: Q& X! H5 O }+ n% }& Y) G: r7 ]7 r! [. G: I2 u
7 |0 E1 y: g* W( f0 K
if (ixstart < 81000) {
8 A7 q6 A0 A2 j; o while (ixstart + 1 < 81001) {
, P% Q- I5 i4 T# c if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {9 l Y. p) G- m0 \) Z9 }# J. {0 b; R
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
$ v% A4 J. K7 x3 O! k% i }0 B4 C" ?$ Q3 ^* G) D% j" y# }
* E8 l' q) h: Y, h ixstart++;
9 v$ q0 O; _2 Y; h0 i% [ }5 e8 V" y# a% l
}
1 ]. S8 J% N% Z, T; H$ H) }: F' N8 H/ ]2 X+ E8 f9 L
ixstart = 1;4 f( {5 L- w5 ~' Y# d
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
$ l) O" |& z! C, \. d3 B if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
! q, `8 O1 ?. _9 ~+ b$ [ ix = 2;
1 F- X+ d( T' W. p% ] exitg1 = false;
0 C" H# d% G& t. x3 E while ((!exitg1) && (ix < 81001)) {
: M9 T: h5 T6 G! O ixstart = ix;
5 U& Z4 I$ e. t- g8 A- z2 }8 T if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
; L4 z; g G4 J# j$ q# w yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
8 ]' j$ P4 ]( J" x% p$ } exitg1 = true;
! `0 _+ u7 n) y8 Q |/ @ } else {
& u. Z2 b+ p4 T* l+ G% t: G ix++;
" Q7 Z0 n/ U; B. \+ H$ h) U }8 J% D; g$ N6 Q* r
}
# u: k! G' k& k/ M6 S }
3 }+ w9 l Z, g& ^& u$ [9 a
) _0 n+ C7 f6 p, y' U if (ixstart < 81000) {+ v. }* [; W" K4 J" q
while (ixstart + 1 < 81001) {1 E [2 _4 K. u& s+ L1 @
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {7 L/ f' g+ k! i& v$ S' {5 i/ o+ q% V
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
5 z. B0 a0 w+ E }
) _# o% `' \' W8 q2 H
% o& V2 v) ?4 D& b ixstart++;: x# v3 f+ M2 B5 _$ R
}
9 \! D G/ v5 {% J. \. T4 |" G }
* ?5 U2 g+ ]/ O2 A9 J7 U; Q
) m( B8 m! j) Z& X8 @ yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
& N) m0 b8 a! b+ t1 g8 K* z* A if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {, [: s. \* W3 R
yiDuanShuJu_mean = mtmp;( n1 S9 a" ^- z6 K
}1 f; A0 |: P8 Y/ C9 ?0 O
: A9 D4 O* A9 W% Z5 Z& a' A
/* 找出极值 */
5 O" E& p- F$ y9 u for (ixstart = 0; ixstart < 81000; ixstart++) {+ r1 S8 ]7 `, m( }" n2 K ?- T" C- a5 S
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;# I* K0 ]; y9 M; \5 A; L
}+ g' Z* R8 w( j T) c9 Y
7 g# I8 l0 c: {/ E8 N A
--------------帖子字数限制------------------
/ f( T& y0 |5 d% b5 A: U7 g, U4 g}
$ d% s3 t+ V# w2 L/ ~+ t1 h
4 B# D# C! `! X( Z" w8 y4 ^' V& N' [- E( d' v5 ]
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|