|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 4 J7 x4 Z7 n8 B) _) I
8 E/ J7 y+ x# q. J; L" a+ W各位大神:. R! U8 b8 F1 L$ U" S) K# @
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
; Y1 E* p* h) E, o( r2 p 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:$ ?" J9 O) v: y, V& D. p( ~9 C
! k: T; ^. R7 i& T
' v- P: P1 ?# [* a. W
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
1 y& J* d h- O6 ?5 Y+ r% O8 q+ n, m+ A' u3 W
并没有其他线程
$ [) g8 A# w7 a8 O, X反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
2 D4 f- |# m" M- u+ L' l也说不定是和堆栈有关系。。。。。。
: E/ V. b- R, \$ W# W+ p请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
$ ]1 o* f; V+ N8 \. a. s
, a* E. i8 h0 q, B$ o J
+ Z- b* i4 j( D1 m8 d' X7 ?2 z. R8 U# l. }
我也很绝望啊,希望大神能帮帮忙,感激不尽,!% E+ A6 {1 z) O- m
% C5 T% w7 I7 b( k0 V J; @& e& g
( T8 [8 }4 d& a; m附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];2 C! i* |/ d6 K* e
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。 }" ^" t7 U! o- @) i/ |
9 g2 s- o* t: |( R4 ?& F
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(" H- f( [4 q4 ?
const double data1000[1000]) {+ K& q0 o+ f6 }! J- n
' Y* W( _3 v/ V" v" R. }8 w int myfuck;+ F& J9 N: a) O& h+ }( N" u
double yiDuanShuJu_mean;& {' D7 i; q6 m( f8 y( @& E
double yiDuanShuJu_LowMean[1000];
+ w4 v7 {% R$ Q. l int ixstart;
q0 |) o$ W$ w6 M: C double dv0[1000];1 |0 s) Z7 _) n) H w
comm_AGC pAGC;6 S. y4 V& L% D
comm_CarrierSynchronizer pFineFreqCompensator;6 Y- w ~- G/ ^% z7 Y
dspcodegen_FIRDecimator pRxFilter;
: N0 ^. j I" m( q" J1 R; q. _4 b comm_SymbolSynchronizer pTimingRec;. g7 t. r! }! k' a; j
comm_PreambleDetector pPrbDet;
6 Z Z, z- k3 J: v# w2 g. h/ M FrameSynchronizer pFrameSync;
3 h; [6 _/ ?5 Z; R2 Y QPSKDataDecoder pDataDecod;' W7 A+ ]) \! N
static double usable_left_filtfilt[81000];* \/ C1 e$ \9 r8 p3 q; a
static double youXiaoShuJu_QuZhiLiu[81000];
: u U, v0 p, l2 D. L, p! U double mtmp;! Y! E1 F7 Y) `3 I2 S6 @
int ix;/ K2 L9 Z2 v* E, j& S
boolean_T exitg2;& p% R3 W: b5 k3 D' m
boolean_T exitg1;
, D8 T' [; X% \ double YiZhenShuJu[800];5 U& ?; x" s) E/ g& `% g
double dv1[800];
2 U9 A. X) S; I( s
- m( L0 J T! \5 W6 W8 k' T" [: [! p; ^2 Z
double b_YiZhenShuJu[800];
& O" ^, A* ?+ k$ w2 r8 V double I_filtfilt[800];( T" q/ V* C/ l
double Q_filtfilt[800];
& K* U, d- Z t# n& G/ r creal_T b_I_filtfilt[800];
; t: E& b5 w$ I creal_T b[800];( P7 ]" p1 } V( J% k
creal_T RCRxSignal[50];
$ `8 P3 l# f1 G+ s# C. i! I8 ]7 f creal_T fineCompSignal[50];
Q" d6 G9 U$ N0 n4 g4 o double phError[50];0 X, C3 b' o9 G8 i2 c8 k2 r# F
creal_T timingRecSignal_data[28];
4 n3 Z4 N0 w% R int timingRecSignal_size[1];
# |( K9 K6 Z0 c/ o double prbIdx_data[28];" L1 t9 Q7 u% ~6 l3 B( z+ e
int prbIdx_size[1];
' [; u% ?+ B% { double dtMt_data[28];1 f% ]5 d5 V% I: n
int dtMt_size[1];
( C4 P1 {% Y/ G creal_T symFrame[25];: Y" [/ l) z: [
boolean_T isFrameValid;
" T+ ~; C0 {, c" o( a5 A) Q8 ], A; o double unusedU0[3];- u: `9 h/ H. B9 m6 H
( V# q. n1 D/ y8 }0 m$ B
//调试过程中的变量7 V" E0 `- k% s5 G. a. k' \/ ?* g
int enough_data;
# k1 H; c" z: l$ I9 F# T
$ v/ K' c$ P4 {/ I0 i int enoughDataFlag;
) U. O0 x' |7 a3 q int yiDuanShuJu_mean_int;7 m( F5 M K3 \% T: x" `1 ~& F( u
int int_sum_dv0;2 o3 D- A$ o( F( U" s0 A
int oo;' A9 P" z( _7 {6 _. [! x9 `) ^
int ii;2 a" p: T m& i9 I+ q& X/ o* S- x
myfuck=10;: K' u* q& E# q* T8 q
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
5 m1 `( }- A3 f; o0 L /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
$ S, z2 L! m5 L" c' q& g
: ~% |) ]( {4 C! g3 m/ M! T yiDuanShuJu_mean = mean(data1000);
7 S: ?. b4 w; U% f: p- W( i* C" P% `0 j5 F6 j
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;8 }2 u- j6 R( w% O/ ^* F$ B+ y6 P
UARTPutc('A');1 b, z. s, V f
UARTPutNum(yiDuanShuJu_mean_int);" q6 B6 `$ X& a% b" `6 m L0 { C* J
UARTPutc('\r');4 L u i; v+ J8 d, ?
UARTPutc('\n');
0 X- t' u( Y3 j1 Z* V- |$ d7 c5 {5 c! {4 a0 c7 A, a1 L9 T
for (ixstart = 0; ixstart < 1000; ixstart++) {% ^- P. ~: {7 [2 z
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;# M2 q, `6 ]* m3 e
}
* V) y8 K4 C4 l' E) [2 ^5 j; ~! J- H5 R' [7 z, n
power(yiDuanShuJu_LowMean, dv0);
8 x4 b- Z& ]6 U. S" X; g/ V9 ]: {5 U6 |" N/ r; x4 r
int_sum_dv0 = (int) sum(dv0);
3 g* i1 G. D. L& m$ z X0 J& E6 o+ N L; p& F. v4 n
UARTPutc('B');
9 D2 n/ b- j! Y! k, X2 E UARTPutNum(int_sum_dv0);
; M; b7 M* r# q UARTPutc('\r');
0 i, |( J. T% L$ a UARTPutc('\n');+ w$ T2 r/ [5 ]; J& T
, j% `( z2 ~; R9 }* `// int compareFlag = int_sum_dv0 > 1.0E+8;
8 H" P0 ~& e Z M8 A% H" s) q8 O! S6 m- X2 l0 q( t
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
1 g, d! Z" t9 k# s, u3 z UARTPutc('C');( W) z4 R" c% O+ {* F5 Z, \
/* 比较信号能量 */
7 ?+ [0 c% t4 W2 k# ~% p /* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */7 S. ?3 d& K/ @+ G! K& P7 A- s
// yiDuanShuJu_mean = 1000.0 * youxiao_k;
6 R6 J( l/ P% h2 @// for (ixstart = 0; ixstart < 1000; ixstart++) {9 y9 a. P% U( z& Z/ G- \
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =& W0 w' P) ]; A$ s" M7 x( D
// yiDuanShuJu_LowMean[ixstart];4 K- s& U7 \1 x# |9 E* x
// }
8 k0 Z% I/ l( N//1 g/ S( o% {3 W- j% n) W4 [' G
// youxiao_k++;) L$ B9 s! o" R7 |5 T+ l
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==& r* b) K; ?* n2 M- O1 R$ V
// /* 感觉要取21个数,即0-20, */. |1 @5 Y/ v5 I3 V3 ?
// enough_data = 10;//有效是10,无效是07 v6 N! m# s& K1 T9 U2 @9 x- B' i
// }
( X/ S( h4 _+ l9 ]2 @4 K3 J }) A* \, M/ x; n6 Z- ]6 z0 T
& [; B5 A( u# b
& d' v" V9 d+ Y enoughDataFlag = 100;2 c4 a* {$ S- P
enoughDataFlag = 1000;/ V( c: K3 I# f& }2 x
enoughDataFlag = 0x02;' n0 d+ F6 `6 ]# v/ r
enoughDataFlag = 200;9 o- w) A! L4 P
3 _, X5 {/ }# H' A int myfuvk1;: y# |/ f- a& f0 N) j
myfuvk1 =11;
. D2 y6 [! s/ s) E, E u, }
) y1 G8 U. ?: U. F1 D; S6 _5 U% M. I, L
enough_data = 0;
* r9 R$ y5 W4 h" P9 n& d
& x# j1 n% ^ Z7 R% q// if(enough_data>50){
9 w- k2 {3 O0 }// enoughDataFlag=0x01;# X/ l2 _9 Y2 M/ g/ N5 ~
// }else if(enough_data<50){, Q: a1 ?( Y9 a+ `, ?! N
// enoughDataFlag=0x00;//0x00还是不行
8 s. f- r3 Q4 f# X6 P' h& c6 a; ~0 b, K3 k+ X// }; h* J, X4 ]1 M n/ {# l w
: _# L3 l, P# C9 s) o9 B
" Y* B4 L$ ~# V% D, g2 f, y
oo=10;
! r( w6 Z' n6 l$ q+ C oo = oo < 5;# P2 j* ]# D1 h! }) \
if(oo){# R" T# }* \% j% [8 o& b8 s
ii=0;; v. J/ @& K! s% g: h
}! ]& j& l3 M8 \7 M" Q- ], F
if(oo < 5){% |* h3 \# l4 ` L8 b' d' q/ @
ii=0;
0 P' k* d2 J1 K& t* C) M7 _! V" l }
% T% C- n& h ~( @* q# L if(oo > 5){
6 Y3 h( B1 R2 V# W ii=0;
3 `3 \7 a9 H. _* F }+ R d1 R/ }- m0 O- }& i
8 g0 H3 A9 _* v# l' B6 ~) w2 C /* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */% C4 W, ~/ @+ T' G& C' J
/* 如果数据足够才执行主程序 */3 I5 P( p; c W4 {7 j: f8 H* g
oo = oo < 5;
9 Q" A7 Q1 b8 x5 ]6 w @ enoughDataFlag = enoughDataFlag < 5;5 H- F& s; d, ]6 I2 V. D( c8 ^1 \6 u* w
if (enoughDataFlag < 5) {( H& B: g3 F7 s
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0. |# q5 Y% ^4 @' \' G5 n% _" u% h$ R
AGC_AGC(&pAGC);1 q k- W& d, x) N
" N. M; x8 Y6 W" q5 ?/ g
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
# j" S V0 h3 {; f h FIRDecimator_FIRDecimator(&pRxFilter);
( m# Z! n1 d! I3 A( N l# g6 Z3 ?+ [- P7 O8 E( }7 W: `
/* Downsampling */1 U2 l L1 }$ A& T! X6 A
c_SymbolSynchronizer_SymbolSync(&pTimingRec); L0 a2 w2 u3 `9 P0 P2 |+ | H6 r
3 l* j: B$ A6 n0 A( M p
c_PreambleDetector_PreambleDete(&pPrbDet);
A* d- n; ~5 Z+ X2 ?- v
$ ?& M2 \- t5 u0 I1 U& H* I /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */4 b" r2 e& p4 J7 [& |
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
' f7 Y5 W- \1 v+ I2 l! t /* %帧数量=100 */
! E9 V; l- }& X% G8 b pFrameSync.isInitialized = 0;& D/ w6 K) w4 a* C* H
! f1 M9 m/ L9 M+ q& i
/* [EOF] */7 U6 I. Q, Q8 J3 D$ W
/* 前导码长度是13 *// q1 r: X$ n& T d4 x9 ~! O
/* %qpsk */
j/ I+ p9 @/ b$ u% e4 \9 o& K" Q0 P pDataDecod.isInitialized = 0;
, m. K* \$ L2 J: v1 t' A- U! M' ]0 J" y
/* end */
% K; D/ ~1 O8 I# i; J D4 K- t4 I+ e /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
- p* N1 J% u4 z7 U/ F+ | /* Convert 3-dB frequency */' ?( S: X$ A" e1 Y
/* Convert 3-dB frequency */9 ~9 J# C s+ y+ F, A8 I
filtfilt(save_buffer, usable_left_filtfilt);
9 v$ K+ R' X9 A k1 x7 A [3 a for (ixstart = 0; ixstart < 81000; ixstart++) {+ d* O1 p k' ~5 M. J' K; _
usable_left_filtfilt[ixstart] *= 2.0;) |# [' y$ o2 ?# A* D
}
" K. R+ I* w# W
( L# @" \/ u" y( Q /* 注意乘2,处理幅度 */
- G k7 N& j: r) e% ^7 |% k /* %% 我发现带通之后其实就均值为0了,不用这一步了 *// `" E# |" r* n$ }
/* %% 行列转换 */# v7 a. K/ Q# ?$ }( n
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);5 U( V" p1 t6 R, Y* W* `
for (ixstart = 0; ixstart < 81000; ixstart++) {1 m$ Q; b% E1 D, [' d5 c' I
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
( f7 U$ J6 U# v( ^- O - yiDuanShuJu_mean;
3 }, @0 L/ O& x% F0 Q }/ P c, K) f0 G9 P
6 L- G( q0 m1 t% R! e# [ /* %% 应该对数据归一化,但是这一步放在哪比较好 */( L) V! c, y2 u& D
ixstart = 1;
8 H5 K: Q8 G5 ^9 b( s mtmp = youXiaoShuJu_QuZhiLiu[0];
3 ^& j$ e- P2 x/ `* d9 \0 c if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {: N6 s$ V7 o# F8 D: Z
ix = 2;2 J% T& B. x& u+ |0 T, i% v
exitg2 = false;
2 V0 `) B. d! K& c v- K& e4 a; L while ((!exitg2) && (ix < 81001)) {
! k( v- `# J" n, F: q ixstart = ix;
' ?. A) ^! n z1 {( {5 | if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {- A. o& ^/ H, e! l0 h5 v- a' z' z' @
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];8 |6 `, @) K8 M+ u# A
exitg2 = true;
3 R! E' r# I4 \2 a+ m) h! f } else {# F5 a( R" A( d
ix++;
/ g D. T4 @( A; S3 m }
5 |3 \3 B1 D' [' P7 q( X8 O }+ z( Y: h2 \5 ~6 t" Y4 w6 d( b- d
}7 ?/ |. |0 i* [% Y
2 o' M0 B8 u0 O+ b- ]8 i
if (ixstart < 81000) {: Z% M3 p) }1 B
while (ixstart + 1 < 81001) {
- ^5 y# W0 E$ U+ S, y if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
6 M/ Y, y% P+ j6 C* C mtmp = youXiaoShuJu_QuZhiLiu[ixstart];+ @8 @% L( Z* z6 w9 U- I+ J
}
5 v8 | f! a; p* I% ?2 i" J6 L% E" }- A
ixstart++;/ f0 c8 o# @; f) n2 M. ?% ]
}
$ S! h+ k" a5 Y. L& ~. c }
5 I- Q- K' e8 x# F
& B* a" C; ]0 d9 G0 l9 K ixstart = 1;
" B8 [) U- z6 j: e: Z) Q$ l7 z yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
) F4 a& ?& \6 h$ n' g# ]0 K if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {) [2 j' i7 N5 i0 ]- e" O
ix = 2;
+ N9 y; o; X: {5 T exitg1 = false;
5 }; A; a Y' C% E while ((!exitg1) && (ix < 81001)) {
8 a2 X4 {! T4 X" Y ^, f ixstart = ix;! `4 D0 F+ _& s' { A# \2 K
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {* O' C' j3 a' B: Q5 {6 B
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];: u0 e7 u# b) R# g$ r
exitg1 = true;
7 g. C' t6 }8 h } else {
& d+ m1 a A1 `2 F ix++;+ A# e# e$ X2 p" d4 d
}
/ i9 e5 D. u% ? }
0 I( ^8 o6 d, ]2 W/ v }
0 J9 ^; Y4 x; y) k; l8 F4 L9 _ o+ ?1 w: P f3 W9 K
if (ixstart < 81000) {0 O% A5 I( Z. e4 l$ U* W& `) H7 a
while (ixstart + 1 < 81001) {7 W3 y6 s/ S7 k0 s6 P( ]4 q, m. H
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
/ e/ ^* P7 }) ?7 j: w yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];* |; y! e0 I' F& |7 B; ^4 L
}0 c5 s) a( V7 a: O+ H
; g# q) `+ Q4 }/ Q! E. c8 S ixstart++;
2 M- S5 W5 o+ A. O$ r }
3 U: u5 m1 g f }6 h$ H0 ~: V, e% C2 h
- f7 G2 \+ w D# O; w$ K3 {3 u* \
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
: n9 x6 ~4 Z7 W& i1 { if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {8 T" k8 P- V. }% A% d, V
yiDuanShuJu_mean = mtmp;
1 T h7 t) H" z2 @ }$ i9 p' c! y! q, Y2 ~* G
. h7 _( n/ a) q/ T3 S5 \$ U! P /* 找出极值 */
2 P& V2 h( P% ]) v% ` for (ixstart = 0; ixstart < 81000; ixstart++) {- A2 M; V) p& B; D
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
5 j. P& t8 d9 l$ N. U }5 n, T% y9 e7 {6 [5 ]
* w5 E$ D+ p M- X' ^$ q
--------------帖子字数限制------------------0 M$ T- g- T, c4 ?: i
}% P, h/ ~6 l* U/ N8 ^/ ^
, f, |+ ?2 V9 x) ~$ R
* o9 G& p& }1 p7 q) G: J8 w |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|