|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 5 c0 N* U, f5 {7 d" Q
8 n. u J, Z( z( a5 B, q各位大神:
0 G4 ] @! O& X 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)6 s# m2 O( f5 J6 u2 Y4 W
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
! k( r L" P: `4 L( d( u0 c: U3 d9 K6 ~0 s
3 F6 Q! @- q+ e" Q# ^9 X5 U- T) v这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。0 R! a7 g8 W) w
# x8 N( }9 w4 W% \并没有其他线程
) a0 o7 Y" x! _! r: W2 ]; p反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
) r+ E# e8 g6 L; @! t6 i7 j也说不定是和堆栈有关系。。。。。。# ]8 u! l+ i) j n1 ~
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数..../ S7 ~4 R7 j# C& w/ C
@- B2 p* ^ H* [1 }% X+ v5 j
0 i! p: J6 L: \% T% t& y8 S
& [$ |" h2 {# W% R* A q* T& b我也很绝望啊,希望大神能帮帮忙,感激不尽,!$ t. y0 ?" B9 F/ `( I! S2 s9 }
+ i8 T3 K; O& r q
+ W1 v6 H4 x/ @9 o1 r' y' R附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];8 V1 U* P- v9 }; @& a
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
% {9 O( q! j; M5 E& m. G3 A4 `) } g: B0 I5 j& G( r
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(; O' X" U; H' z8 ^+ N* {* J2 E6 E
const double data1000[1000]) {
|% D) u4 f% X7 ^& Q, n5 L+ q, n. O8 k. H. g. F
int myfuck;/ R, T. E M3 o1 p
double yiDuanShuJu_mean;
5 j& e8 ^/ {; E6 | double yiDuanShuJu_LowMean[1000];' e7 p4 H: P: u
int ixstart;
$ ], {" j! B. z& G/ J3 B3 L double dv0[1000];
0 h" y/ R2 ^: Z5 D comm_AGC pAGC;3 e. c% {# o1 t4 R
comm_CarrierSynchronizer pFineFreqCompensator;; c4 _# Y, \4 t) ^ _0 u/ w
dspcodegen_FIRDecimator pRxFilter;
- p' l. D3 T, B# l$ z( E9 v* { comm_SymbolSynchronizer pTimingRec;
$ z- i1 z+ ^9 W3 e" ]9 ?& K comm_PreambleDetector pPrbDet;# [# j k. j$ n' n$ _
FrameSynchronizer pFrameSync;
6 A" Z0 k5 I! V7 e8 ] QPSKDataDecoder pDataDecod;
8 u4 M( `2 V8 w* O% K3 x0 V6 P% k8 ~ static double usable_left_filtfilt[81000];
0 p2 k, l- ^& w6 p) t9 H, C static double youXiaoShuJu_QuZhiLiu[81000];
+ o5 K. \9 M# f! |+ z" B' Y* K double mtmp;( A* J6 `; h1 }% P/ d, s0 p
int ix;' @' `2 b# h3 X- q! N+ Q
boolean_T exitg2;) F6 l6 [* o. }
boolean_T exitg1;* V7 [8 i8 k) M! ?0 B3 C
double YiZhenShuJu[800];
2 {/ o# P$ Y9 V M double dv1[800];
9 S/ N+ K0 N9 O- M
; s/ T! G% h% S2 w
9 ~$ _# q4 `$ b1 K double b_YiZhenShuJu[800];# L$ h+ X2 D, [ J& x
double I_filtfilt[800];
& l! v/ J3 u) R- r% C8 i6 l9 m$ z/ c double Q_filtfilt[800];, I" j6 R( B- I, K
creal_T b_I_filtfilt[800];/ S. i# S. @2 O; l+ U$ J: m7 b
creal_T b[800];
9 z* b- q3 W0 c! v, v5 z$ k creal_T RCRxSignal[50];
( \7 U( C9 ~7 F( U4 s creal_T fineCompSignal[50];
% I. m5 s C/ P' v" _ double phError[50];- O% e; U9 g3 w% q, j* Z
creal_T timingRecSignal_data[28];
5 L! |8 v" F M3 t. X- w1 b6 k1 t int timingRecSignal_size[1];& A2 R& ]7 s3 e' ^+ U" W
double prbIdx_data[28];
, B8 H ] R2 R; p3 y int prbIdx_size[1];# a1 i9 u# v9 D o
double dtMt_data[28];
# N0 O/ j1 b3 {7 r) x& o8 f int dtMt_size[1];
: S2 }6 f5 E! B1 C2 l creal_T symFrame[25];
} t3 G' e- D# {/ F: } boolean_T isFrameValid;6 @& h: n/ W' O% Y4 ]
double unusedU0[3];% ~, v7 S% A% ?% g+ J/ H
, ^* l! [" ~% c k' J$ c' |
//调试过程中的变量
0 k# J8 M9 K$ E* C. | int enough_data;
5 E: A) h: E% z- k3 g, a
`8 g: }* R8 U( L/ J int enoughDataFlag;
! x3 {$ f6 A2 `) a% P Q, w2 V& D int yiDuanShuJu_mean_int;2 |) `7 W: \; O; N
int int_sum_dv0;0 {: S6 A+ g- p; f6 ~& B
int oo;
# r& K# \/ k+ ] \ int ii;
' Z" e/ v: P$ V4 z( G myfuck=10;; V2 l" x. Z/ I; w! }9 ?
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */, r8 s# n. f1 }+ }. X! e2 r9 D
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */; D! o( `9 P- J9 X/ E- T9 `# \% w
9 z, w/ b7 N6 k. y yiDuanShuJu_mean = mean(data1000);) T: ~, }3 ?1 g( A
2 A" s4 k3 o. \( k- c! ?
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
* e6 T4 p& [5 |% C4 K# v6 u UARTPutc('A');
5 n+ @" H& y2 Q UARTPutNum(yiDuanShuJu_mean_int);
* q* e$ w& a T$ o/ K, Y9 D+ J1 s UARTPutc('\r');
5 ~$ n" n2 S! \6 h* i UARTPutc('\n');+ @ g1 Q8 g! T5 }# I
6 x# w6 f% j" y6 ^. {3 g/ z( A) t for (ixstart = 0; ixstart < 1000; ixstart++) {8 y) v& h3 n& G( ^
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;1 o; ^& i9 }; M1 j f5 V$ ?4 ]
}
$ h, G5 U X4 `: z& T
. Y& D+ T3 [9 d' l2 n" t/ H" M power(yiDuanShuJu_LowMean, dv0);6 P5 n" q; y" W: ~& T
$ y* S- d# U" ^1 Z5 p: u
int_sum_dv0 = (int) sum(dv0);
6 l, \7 d7 w4 O% H, V
2 b& n- O. f, L9 @. O' R UARTPutc('B');
+ Q& M3 T* }! N! K' x UARTPutNum(int_sum_dv0);" H) h" G! D; m7 y' s# L- C
UARTPutc('\r');9 g; [$ p% A4 U4 u* o
UARTPutc('\n');; a3 A& {+ n/ N2 l
& A, J7 l6 V$ v6 G4 t3 x5 E
// int compareFlag = int_sum_dv0 > 1.0E+8;
% [* w' h+ q: {5 {" E( Q/ W
+ K( T& Q$ I7 V7 S0 `" V- S if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?5 v: E' Q; q! E0 o P2 r
UARTPutc('C');$ T% Y V% z9 f1 w7 i* v
/* 比较信号能量 */
. B2 d0 u9 P) z# E( _) _/ g" _ /* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
) k$ y1 M0 a/ t! b l7 ?// yiDuanShuJu_mean = 1000.0 * youxiao_k;% a3 P" B6 {: W9 K6 s+ o
// for (ixstart = 0; ixstart < 1000; ixstart++) {
; T7 S* ~- B D) K1 P: M- B// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =) k* y' c, E9 U V: W7 k
// yiDuanShuJu_LowMean[ixstart];
8 _5 F9 D! f3 |# E// }
+ h% ^6 T9 D( k8 d7 j7 F//
4 a4 r, h7 I; s& F4 B, I( s2 s// youxiao_k++;
1 M6 a) N6 E( v5 ]$ a2 q' C// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
0 V6 ?# U: ^- l. s) k: U2 @4 |// /* 感觉要取21个数,即0-20, */4 Q% c( U' x% s0 [' \
// enough_data = 10;//有效是10,无效是0
]& R4 F+ Q2 X3 c9 S' L9 y$ K; h( I// }5 k7 V9 S& _8 u9 ]7 G- }- j* c
}
: p% s M# }+ v1 x |4 [7 A9 d1 n4 D6 _' F3 y u1 k- T l6 I7 |, E+ u
# J& {: D' e* N7 _- q0 j3 g enoughDataFlag = 100;
- S0 m, o' B! m4 q y L& _" a enoughDataFlag = 1000;, V; E+ _4 |7 I! p+ @9 R- Z& G
enoughDataFlag = 0x02;) q( J7 N: p# `/ C* j
enoughDataFlag = 200;
" v- T6 M- F! e* S. ^ ?1 a
4 Q, K w, I5 d int myfuvk1;$ D; e2 o$ H- x- F8 E3 A
myfuvk1 =11;
1 e# K H9 E) A! s$ G' v, Y6 H" c( w; m- U% O2 Y: x* |
: f1 Y- }# H0 w0 R enough_data = 0;( b5 J/ q: f$ l5 [# d& s$ A
7 ^! e' |$ O& T; d
// if(enough_data>50){4 \* m5 J, J# k7 a7 M
// enoughDataFlag=0x01;
7 l9 N8 N4 i) H! r' N' F& [' k% J// }else if(enough_data<50){
9 v2 l6 l" q, y, J$ c9 T& w& b9 O// enoughDataFlag=0x00;//0x00还是不行( t- w0 n' O4 s. M1 x
// }) F; F' r( o$ j% ]+ r
+ d) c- K7 [1 ?! @% {! k- C9 e7 T( ?6 B' d/ y
oo=10;7 N# P" J% @( N6 J2 E* d" ` {
oo = oo < 5;
% ~' Z" y3 m9 T if(oo){
3 ]8 o; v! t5 s! R" ~! N ii=0;
! m2 Q$ h0 c: z- _" x( { }' M" U- I0 m/ K- W
if(oo < 5){, o0 n; n4 y% q; Q0 w
ii=0;9 B; N3 d( w8 |2 t3 o' r
}' `; V5 ?: e4 D
if(oo > 5){9 C, L7 K6 F$ f5 e- H
ii=0;# J# {0 p, c n) u! [
}
3 G% o( t: \1 ^* I" I5 k7 r. d& B$ m. s: y0 L
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
M: |1 b5 H3 R, o3 N3 | /* 如果数据足够才执行主程序 */& b) ~5 T1 M" v! a/ W% Z
oo = oo < 5;6 b) M$ N1 X) Q
enoughDataFlag = enoughDataFlag < 5;7 g# ?$ }6 c* p5 E% Z$ Q
if (enoughDataFlag < 5) {+ R) w$ x, A& C0 t# l) f2 `
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是05 _ ^# X ?+ c
AGC_AGC(&pAGC);
: y9 @( j9 X1 n/ S
0 J T- c! \9 H) v1 u c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);& o. I6 B R7 J& I8 y
FIRDecimator_FIRDecimator(&pRxFilter);/ s& |' k4 z8 ?9 R1 U+ v
5 P+ i3 C$ F' i5 L8 F9 [; J( h
/* Downsampling */
; [5 B0 P, d3 F! O c_SymbolSynchronizer_SymbolSync(&pTimingRec);
7 p! }# H- @' B( g- p, M
+ ^4 z" y r, M# }8 d( B c_PreambleDetector_PreambleDete(&pPrbDet);8 h& K6 q3 p6 @ ?6 x/ [
# |+ d+ E+ r( _1 W# b /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */" r5 r7 g% D( H7 e, l4 i
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
0 \# U. s% U7 u# W /* %帧数量=100 */2 l6 N. i6 {, _. u# [4 b. ~
pFrameSync.isInitialized = 0;1 J, f% d7 M# a, K
" [. [& \9 n$ M
/* [EOF] */
+ `- k x9 V I4 F& R% n /* 前导码长度是13 */+ [+ `3 |2 q3 m
/* %qpsk */
" q9 x( F6 ?* V7 m. p/ |& b6 [ pDataDecod.isInitialized = 0;/ ~6 c9 I6 |, c" j1 q1 v% p
8 ^: K( n( Y0 k+ M, Z" Y
/* end */
* h% ]) c2 }; d% t0 f/ o0 _8 F" l /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */" U$ K# P5 z2 J6 C! l
/* Convert 3-dB frequency */7 `' k3 E1 j$ D. y
/* Convert 3-dB frequency */4 F5 L- T& p9 R4 e5 m% K( ?) D
filtfilt(save_buffer, usable_left_filtfilt);8 N% w: p- C: l
for (ixstart = 0; ixstart < 81000; ixstart++) {
$ ~# F2 J: a9 i# ]+ G! C' {0 X usable_left_filtfilt[ixstart] *= 2.0;( W; P. z- _% p0 H
}
2 K7 I" ~# M# D- A6 A) T" P Z" E! `$ v# \! U1 t% N' m
/* 注意乘2,处理幅度 */- j, j8 c3 O$ \
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */
6 X$ ?2 b7 h' t /* %% 行列转换 *// S5 |5 [1 o6 g: t- `8 o- Q
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);0 |% q% g6 N5 i) E# w" ?
for (ixstart = 0; ixstart < 81000; ixstart++) {
" y1 Z9 h: L/ |4 c' a4 U youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]- l1 o" l5 h# X6 b% I
- yiDuanShuJu_mean;
3 v; D: x& O- y. S; ~6 Z, ]! t/ R }9 |) S& c4 i2 }7 d: o
# g) F% |) e2 t7 l9 |
/* %% 应该对数据归一化,但是这一步放在哪比较好 */$ g% s( ?6 Q: R- L/ L
ixstart = 1;& C3 ^4 i7 m- l7 \5 ]. A
mtmp = youXiaoShuJu_QuZhiLiu[0];/ [8 F9 E; |# |- |, V/ ^/ ^
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {0 |# \% R$ ~. S
ix = 2;
# |9 j$ J3 M# C' f7 b" s exitg2 = false;, _4 Z! v$ [! }: X5 x. I( o
while ((!exitg2) && (ix < 81001)) {
# X8 B8 ^7 l# | ixstart = ix;
2 p% U6 {" E. r) K( M& n if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {- A- D/ f. c" b& `, V+ f6 e
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
% {8 N7 i$ Y+ a5 @6 H2 | exitg2 = true;0 G/ [. T n; C* \% V0 m
} else {
3 r7 ]# U- g5 {) }5 c ix++; P# ~: F$ `# v
}' y' ~. O) Y5 S, {0 V0 r) X
}5 \ `: k% t# q
}
- L, z; v+ j" n6 N8 ]0 Q* c2 C( B' `, _* q* a/ ]% ~* T+ c1 o6 g
if (ixstart < 81000) {
7 ~2 ?% r* @) n; Y4 v# t3 _; S while (ixstart + 1 < 81001) {
' u$ z# u% e9 ?3 r/ E9 n7 y if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {" d* h' \6 X) ]% \1 h5 R- x
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];. K3 ~3 O0 e2 l+ ?
}
3 ^, G* l& [! c! E7 U
2 w: R: X: o2 g! o1 B l ixstart++;% P4 T' S* S5 N- S7 C
}
{+ y9 e$ g" t }
: `" P1 U: A. x2 \* @# B0 d* y2 Y8 G6 p, `: H6 z- G
ixstart = 1;3 @8 F" I# t, H9 ~
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
h. B3 D q+ `* |" \ if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
; r- x0 W3 m* T# q4 J9 A3 r ix = 2;) N, [% m5 ?& f( w
exitg1 = false;
" |5 R9 O- H( [6 H, ~4 ` while ((!exitg1) && (ix < 81001)) {; z0 y5 K6 ]- |. E* r" n
ixstart = ix;
9 H' t$ @% g4 Q5 v if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {- ^$ @) c) q4 Q' W
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];9 z; @# X! D7 V! q; j3 Q
exitg1 = true;
( j3 X$ L" K+ [ } else {
* C6 m I0 ]/ G/ a# l* F1 P8 P8 x ix++;
' I. ]- s' r* V5 ~. J* @ }
, h! b+ v. B ~" J }
: m' | Q/ ?! D; l6 ? }( S8 S, F! b( E; l
$ t0 T$ }+ B7 W/ S0 B' e0 Q8 b if (ixstart < 81000) {
9 g. k% k9 I: n, U( X7 n% \ while (ixstart + 1 < 81001) {
6 J+ T. h* d6 ]* K7 b9 f if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {4 d6 b- ]0 u) J; L0 S1 K8 z$ j6 H
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];: O6 o1 T- j2 o% m
}/ c- w+ A7 T9 O* {' R) Z
8 T/ e( h+ m, V# d6 o1 Z# |
ixstart++;- b& a' @' j" Z" I- O( w% r
}1 d- _: c4 C# G9 a8 _
}
7 |+ L+ J* s- B: x& n( v- D; K2 P4 O t* V. S' Z! p* _
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
, _4 t9 J8 E( C( f( C if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {; X! `$ k7 g% d& E; D( I
yiDuanShuJu_mean = mtmp;! a2 E! M. u I& P. }
}
8 }8 U% h( b# F- i( \9 I
. P1 s' g) C7 ~1 ` /* 找出极值 */; t! V4 u$ q" M( L1 D
for (ixstart = 0; ixstart < 81000; ixstart++) {
# t- j& `- [6 X- w1 Y0 X. X# v% ]& [) O youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
+ j1 L9 a7 ]2 _" Y0 F* p& x }
+ \; I( j7 H" ]: ^, N% k+ e, s3 q0 x
--------------帖子字数限制------------------3 Y; j, T, ^6 n7 l$ M$ n4 J* x- E
}5 \4 q5 ]7 d5 \, g0 Q7 t+ k. m
7 f. {" i1 q- V. [0 ]4 S4 g; O
1 j4 E- f9 V/ e$ K7 Z& h |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|