|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
, w/ | m9 x& R0 {+ K* \
' s' H; y4 ~4 n" ]' W( m6 {各位大神:8 @2 k; p4 a( r7 }: V
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
3 x% c. }& a A' ?) m! a 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
. L) @7 R# V# y3 q5 [7 I- N: b/ F/ p; e1 ~5 ]' H1 y/ A
$ q0 |# D) b( _
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。$ c- V' p5 y: \' H& |! Z" r
' E% O8 [7 G* I并没有其他线程- m2 Q' P( a. c/ L
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。9 M# w& f; t- }' i0 Q3 F
也说不定是和堆栈有关系。。。。。。
- C0 x$ {! r% G. e) p请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....- ^+ G! o5 b: v% H: o
0 b$ g) u7 T& a* }( r2 _7 B2 \+ a6 w
T5 i/ x. Q" i4 E0 R* e
" V' |' `5 y' M8 \3 d, J9 l, P
我也很绝望啊,希望大神能帮帮忙,感激不尽,!
* z v- N; ^, F
$ \0 @1 N5 R1 {6 t0 V" H2 {3 X+ a/ J2 g9 g& u
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
5 N0 y4 S2 w$ A8 H. s+ ?& ]4 | static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。4 \+ U3 W$ W! ]! o8 I ]
( t& C7 a& M, `" h# @ y
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
% d, q8 r" t6 t- w const double data1000[1000]) {
# q6 Q5 C- p! z4 E/ I8 F( p
' F9 b2 Z0 X' Z int myfuck;
# ^! D* y; J5 W" p k double yiDuanShuJu_mean;
6 e8 y6 V- M# ?. u double yiDuanShuJu_LowMean[1000];) I `! n- I2 Q
int ixstart;
- F3 s# }6 ?8 m, n6 I T) Q* l) C double dv0[1000];
" h- B, ?" |( m4 b comm_AGC pAGC;
, @5 g7 ^0 I4 R4 H1 I/ Z9 X3 S8 ] comm_CarrierSynchronizer pFineFreqCompensator;9 T2 C, J9 L+ N3 w
dspcodegen_FIRDecimator pRxFilter;
! y+ \2 _% \* Y1 u" A- c comm_SymbolSynchronizer pTimingRec;
% k1 T* L; @: Y7 m) C' i comm_PreambleDetector pPrbDet;
1 }6 d$ M( q) M0 E. B FrameSynchronizer pFrameSync;
; b0 } _0 d% R QPSKDataDecoder pDataDecod;
X4 x, ]1 o2 r; U! g static double usable_left_filtfilt[81000];# o. s3 B: r- a
static double youXiaoShuJu_QuZhiLiu[81000];
9 T+ Z& A' @4 o2 A* E double mtmp;
/ b5 _8 k1 B- U% U T' ^2 N int ix;
* y+ _4 C/ _/ o4 b+ s& S boolean_T exitg2;
4 O, _7 Z2 B0 t boolean_T exitg1;
7 v# \! d! V d- x/ {" @( y double YiZhenShuJu[800];5 v4 |6 M. |( {; b' _1 t
double dv1[800];
# n) P+ l' V* T) C+ Q
5 Z( e* _% L; ~+ a/ G$ G1 e, V& [! e* V
double b_YiZhenShuJu[800];
+ Z+ g; x1 U2 _2 O0 r3 C double I_filtfilt[800];' N* n" Q" @+ h( ~3 m7 `
double Q_filtfilt[800];
/ U0 [( z( A; |8 i. g( S7 s; i- v# d creal_T b_I_filtfilt[800];
) z K6 Y* K8 G. w8 f creal_T b[800];
2 {1 j3 Y7 G1 o1 D3 W creal_T RCRxSignal[50];
' ]7 J9 b1 c' A7 O" F5 C creal_T fineCompSignal[50];
3 K4 }) U/ v' e4 M( G4 @7 F( s" M double phError[50];
* p) ?* v6 d: X3 O+ j1 g$ X creal_T timingRecSignal_data[28];
' X3 u, \% [1 A, u% v v, V int timingRecSignal_size[1];
% {. P3 _4 a- d) L2 W X double prbIdx_data[28];; k% ~0 O, Q7 F2 O% u) ?
int prbIdx_size[1];
1 m# C. c, o/ a0 I, ? double dtMt_data[28];
* J* J1 x5 q4 T1 [+ }3 { int dtMt_size[1];
% P H) b+ _5 {: `$ f creal_T symFrame[25];* d+ s0 [& c4 Y7 R
boolean_T isFrameValid;
9 _) P* @8 ?+ N& Q* z1 f8 Q double unusedU0[3];: |& I% P' ?" B- {
$ B" W# v8 b. |! v+ i8 b
//调试过程中的变量
: ~0 a* M& f) m8 |; t e- Y* v int enough_data;. }# g- q6 x' w. }. L
" j2 W7 b6 D% W% B! D0 D# J int enoughDataFlag;
* Y0 o6 _9 Q8 l- H7 F: X2 \ int yiDuanShuJu_mean_int;
* w3 U0 y4 F. m, O7 Y int int_sum_dv0;6 N- X0 X1 O" b0 O
int oo;! {* b: }: y' C$ C. P. }/ ~) \
int ii;4 g1 T# D# }: E! a5 P1 H9 A
myfuck=10;& B; u" `; D* ^+ v
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
/ d% j7 g0 M2 o0 `4 h) w /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
$ `* I+ r! T/ ?4 X) T& @
h. A+ O+ s" |6 x) L yiDuanShuJu_mean = mean(data1000);- Z# v0 U( D* \; e/ c
# ~+ ~- g* u2 Z- ]
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;. @. M& z# ~+ T6 l0 Z8 E
UARTPutc('A');4 h9 y7 A/ V( S5 P' h _
UARTPutNum(yiDuanShuJu_mean_int);! y! T4 e7 T. |; \
UARTPutc('\r');
1 e( Q6 \, B1 ~2 }7 P- p" i8 k UARTPutc('\n');; ]+ w$ R# _0 z$ E* s
5 B% T& D& I+ v9 d2 `9 t for (ixstart = 0; ixstart < 1000; ixstart++) {
! L$ @4 G5 z/ X' z yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
5 B( c+ d( @ K" y7 L; {0 r0 O% q* U }
& @' C' h) D% ^, Z7 v, b8 C+ h- G8 `1 h' Q' i$ o* c* n
power(yiDuanShuJu_LowMean, dv0);# l a7 g2 U+ L2 o% ~: t9 i+ Y
$ n" E7 _: o8 h4 D0 n7 j* b' n+ m int_sum_dv0 = (int) sum(dv0);
- U+ v" i4 h v/ V$ X
, B: Q$ _+ @6 e$ T; W, y. O UARTPutc('B');3 \* e5 k0 N" X; `. |" [* t
UARTPutNum(int_sum_dv0);6 O9 m6 w0 i8 y! p. A$ A% H$ W
UARTPutc('\r');; R1 X: r( P8 m' u! E [
UARTPutc('\n');9 z# I1 z3 R$ Z; e- Y# P
+ ]& v( |. h' T
// int compareFlag = int_sum_dv0 > 1.0E+8;6 Q" _3 D4 d) Q( \. f7 A5 q a
; R3 O) H7 J/ k1 \1 ~/ Z( [: Q+ ^% k if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
- J, |+ k- T3 @% D7 e UARTPutc('C');
% q% y7 V( z4 X3 c; J( H) O" ~ /* 比较信号能量 */" o# m3 S! }- N. Z# |8 y
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */( P! W. |$ K. L+ u: g8 B7 ~
// yiDuanShuJu_mean = 1000.0 * youxiao_k;) g" V$ s- A) w4 W3 n+ t& Z% `) V2 N% R
// for (ixstart = 0; ixstart < 1000; ixstart++) {
8 q9 \8 O% N% Q6 a& ^// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =- ]; o6 a+ h1 e8 |5 ]
// yiDuanShuJu_LowMean[ixstart];! |2 L3 D& D4 T/ f. N: I2 S
// } k, G2 v+ O- q0 J: w4 z
//
, i# \1 O! n- s; z' [// youxiao_k++;
% }- n8 Y# T* O! m// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==' F% t: o r7 P% }- p
// /* 感觉要取21个数,即0-20, */
* A) @9 T1 p' o3 o% F2 z' L// enough_data = 10;//有效是10,无效是0
+ `% T6 I+ f+ l7 F( X" e// }& ^: d2 \, `3 E4 }. R L) D/ [
}
. I) u3 t7 B5 U: W+ P' K M( M8 V5 \* b7 |' k: {
+ \$ i! W# h1 v1 l* T enoughDataFlag = 100;
( R+ Q$ \& I- c enoughDataFlag = 1000;! w. W" ^+ f$ o2 U! x" {
enoughDataFlag = 0x02;: ~+ c8 V1 q; E* R X
enoughDataFlag = 200;
* K; [% Z% a! D; b k% ?" w" A! A3 z# p* z% b' a3 f
int myfuvk1;* U( s. Z4 `6 O
myfuvk1 =11;
, z) |7 l$ ]: s7 m: o
4 p. Z _+ |6 E' ^& o
1 U& Z9 q9 ~' h- @/ Q enough_data = 0;
& ?2 X. [6 K# `
: k7 M1 B' I2 k8 I+ O5 f// if(enough_data>50){
/ _, P$ ? u! K// enoughDataFlag=0x01;" j+ w1 ]2 R9 D7 k/ k U8 F
// }else if(enough_data<50){6 ~: j0 Z I/ l6 d1 c
// enoughDataFlag=0x00;//0x00还是不行
' U# q8 _ D+ p4 N, t8 K" E$ w// }/ I C; ^$ a% n7 S) D
& ]3 l3 X( ~ ~$ o% o Q5 v7 @
4 s9 C7 z* A4 ]! }1 O oo=10;( X/ p# V% Q* G; {% v+ q* [
oo = oo < 5;. o+ s0 c# s3 Y+ ^
if(oo){
/ s1 N# [# F9 z; g8 l% _7 r ii=0;
- N, Y2 e- o2 X! i5 U }
% L u9 F l2 }/ o( W5 g if(oo < 5){
C& l) S, x9 ?1 u ii=0;! y# t! J3 j2 K4 s4 s
}
% l a5 }& [* t7 e; R! @6 V6 N7 | if(oo > 5){
% n1 R& \ }+ ?: ]4 y ii=0;
, I+ V# B$ _0 W' X+ J' o" S }
z! @& V# Z" l8 x: O. n1 ]' W2 D% O* v9 N; K
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */( \8 t; q* u5 N( { Q- ~ G
/* 如果数据足够才执行主程序 */
4 d' h, s4 P7 ~9 b' A" y* ~ oo = oo < 5;
6 P! z4 p# h1 z. n }- Z; a! U enoughDataFlag = enoughDataFlag < 5;5 c; L3 A1 e$ w. \# }5 v
if (enoughDataFlag < 5) {0 k# x! t$ ]" e/ g! X7 T0 y
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
8 i7 \, d9 E) K. }+ ~ AGC_AGC(&pAGC);
6 E0 d$ }# @; z. e5 v9 K. ? d3 U% L5 l& `6 }
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
9 `0 {0 n A" M5 u4 g% X FIRDecimator_FIRDecimator(&pRxFilter);
& u% J+ s/ a, e, E. {7 n# I1 z' A" R0 N w. t
/* Downsampling *// \+ C$ {9 ^+ [) M- t8 G
c_SymbolSynchronizer_SymbolSync(&pTimingRec);
7 }( y' T& A& J; c% S
1 {7 N3 {* ^* _6 |, ? c_PreambleDetector_PreambleDete(&pPrbDet);' x: b3 o$ p: Q( C v3 L
: O) g4 [8 b; z
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */1 N; _/ X, c; o6 `9 G$ Q$ n; L
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
2 T- q- t% U0 b/ q! A/ b /* %帧数量=100 */) F& x: c7 o2 y% X
pFrameSync.isInitialized = 0;
6 |4 N: ?" w0 g8 v( s
" Q$ q+ v* [) ?3 |3 p- I8 {* B2 d /* [EOF] */
1 m6 u; a' O% b7 Z) t /* 前导码长度是13 */7 x7 [) h# i# U5 j, d
/* %qpsk */7 P$ ~, |& x7 h
pDataDecod.isInitialized = 0;+ c, h7 k# v) i
& `3 o+ T. c5 y /* end */
5 t- g+ ^9 C5 H3 P /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
% P7 a; a: f3 z0 ^1 J- d /* Convert 3-dB frequency */% ^' J' Y* Z9 c2 c
/* Convert 3-dB frequency */
' p# u9 q$ @7 ?* l0 _0 q filtfilt(save_buffer, usable_left_filtfilt);
+ L; [( a' }; O for (ixstart = 0; ixstart < 81000; ixstart++) {
7 l# x: k, I- b( z9 j4 T, D" C1 |+ b$ C usable_left_filtfilt[ixstart] *= 2.0;
: n# ~8 k- d$ Z. i6 G, l2 h }
% @. ?/ P H$ S/ x
. N3 J: c" t3 }- ^+ U3 ~/ { /* 注意乘2,处理幅度 */
1 x3 c( M3 q2 O1 p /* %% 我发现带通之后其实就均值为0了,不用这一步了 */* g. B, y- [9 ?2 M1 h7 m3 J
/* %% 行列转换 */
2 t7 J; ]5 x- P4 o. O) e/ N; g yiDuanShuJu_mean = b_mean(usable_left_filtfilt);& i& S6 V) M) k3 |4 ~# u2 y
for (ixstart = 0; ixstart < 81000; ixstart++) {
4 [" V8 J! [0 l youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]+ _+ W, ~. x2 f1 v& N+ k( Q
- yiDuanShuJu_mean;5 K* ^7 D' W+ g8 Q, V
}0 t* z' q N" M4 V$ s
# q+ q9 A" y2 C) C! d) ?: E3 Y/ F /* %% 应该对数据归一化,但是这一步放在哪比较好 */$ }: E* B: h' c8 }% P/ x4 q
ixstart = 1;
$ C" e- _2 ? i mtmp = youXiaoShuJu_QuZhiLiu[0];) A; r. T* O" F1 m
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
, h; A4 T/ ]' ~- O, J, e ix = 2;7 U `( J8 G! y% o4 C3 x1 t) s
exitg2 = false;0 L7 r. D0 A% h+ {: T2 ]$ j3 |8 W% G
while ((!exitg2) && (ix < 81001)) {2 ^" `- u8 O" s9 X' W3 a
ixstart = ix;
$ h* S1 z! t9 h: i; { if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
/ X; Y; r% q" c& }% D" G mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];# q2 b& a7 E3 H: U( c" C) E M
exitg2 = true;
" E7 y% M" [% a( z6 f. W } else {
% {9 r# ] N) @, A' v2 w ix++;) k" g6 Y$ X' [/ D# ~3 y( V! |- |
}
! p4 D# _3 b, E% Q9 p9 S |$ C }
% }% |( [) _; j# d3 p2 ^" k }
. j. ?( f& I0 ^' g
) Z/ {) k' R* `% j3 Q if (ixstart < 81000) {7 x4 a! |) ]6 |" I
while (ixstart + 1 < 81001) {8 K' o E) h5 X- D
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
5 A% g p' z: b mtmp = youXiaoShuJu_QuZhiLiu[ixstart];! A) }6 K7 \ c
}6 s- J& ~. j) A- B, g5 R3 a
. `% z# E3 R3 \5 w
ixstart++; M: c8 g% S3 c4 y# A' |
}
3 n: \% M# R& v# U* n }
5 Z! I% P9 R3 V2 _$ X
' H' q& }$ _% ` ~% j ixstart = 1;
/ X; J; ] q6 J2 P" i6 x. T1 h7 w8 z yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
" ~7 f; w* w8 U; ~ K. a( n' b6 h' o8 D if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
( \+ d5 c6 y! f* N1 K: y# w ix = 2;
0 I' Q, P& }% e' p2 E P" l! T exitg1 = false;
) K. p2 n. F O) | while ((!exitg1) && (ix < 81001)) {3 A' n1 Y6 r4 |, x
ixstart = ix;
8 n* [6 a, L. u. |) B2 f if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {1 t8 S6 I/ q% Z8 w l
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
6 y8 T; H+ c, t# w$ G exitg1 = true;8 ~" y: _9 I8 e) z4 t
} else {: A& c ?& ^/ Z! g8 \1 W! U
ix++;
- U* t( l. y0 ?7 { }
" H' G, b1 E& E2 Q" {1 W }
" R: L9 q" |4 Y- y! ^ }
3 k, j8 d3 L5 H- k$ o+ d9 a: o) o+ p; c
if (ixstart < 81000) {
8 T9 {# D. q* t; G while (ixstart + 1 < 81001) {
( ]+ o7 @+ h; p; L0 y if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {! Y! T! C6 \+ i0 x% F
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];; Y0 D- g" Z; a* X
}
@% S0 J: z/ P, u6 j! s6 A" u, U1 P# a
ixstart++;' U, G& G- x7 X9 @
}
4 i! [) ~% x! a/ C: C }& [6 a% F9 |: u: m( t* D
/ d E6 F4 s# B( M yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);1 l& ~2 _0 H8 }% x5 d+ o8 ]; R* X# F
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
) u+ Q+ @' n. h) j! u yiDuanShuJu_mean = mtmp;
* F x7 [8 }6 O8 l; m/ M }3 k! ?) Q) W$ R; V- t% w
# d( E; \; R9 u4 A$ j$ I /* 找出极值 */5 Z' P: |8 q, F9 K. X/ K& v( ^
for (ixstart = 0; ixstart < 81000; ixstart++) {
, l! x3 V- O( T2 u youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
$ _- O* P) B6 R- F9 x }
( s* D, t( s$ d) T+ G2 w% D* X$ M- H6 H. E' r' ?" {' c. x$ f1 l
--------------帖子字数限制------------------; _# j0 A9 H0 J- m3 A( R5 Y. {
}
$ G. `# Y6 O# C/ [6 Z7 n; T- h& R8 K' W! \* S4 Q
' I' R, [5 g# j$ S- ]) v E
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|