|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
) Y8 r, Z I, _: g4 ~4 H6 A# N7 \( { I3 Q1 O
各位大神:
8 k/ q4 g: z5 y$ D$ i 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
+ L9 @, Q% M- Z; H( W* f) b 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:. L. E1 ?9 X5 z
1 l1 C0 K9 Z( w( _( H* K
, d' S7 t* e" i这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。: P- _- H! G) h) J, h! r
+ ]9 t& q+ W. j/ P
并没有其他线程
0 U& I: K2 F2 t* R' r反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。% q7 z( V. ^: f6 K( h) V
也说不定是和堆栈有关系。。。。。。
5 X0 {. d' D- ?8 j4 a请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
: z _% r( |/ E7 L+ Z3 t D1 s; r$ P2 o8 `# Q! S; F
8 x5 w3 u% m' A, d) c3 v% @. m; d5 y; g7 ^- B8 G' _ e
我也很绝望啊,希望大神能帮帮忙,感激不尽,!
5 T' F/ Q. m- ?1 X/ ?, Q( y( G2 t& M+ @, V
7 [2 O: R4 S0 T. `* o/ T5 h附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
6 y+ ^9 m8 O u0 T& O static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
`- `/ D* v3 f! ^7 N0 R1 @ O6 }5 Y3 E6 ]
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(. ^$ N) s4 G- H' T% p" Y1 e8 V1 c
const double data1000[1000]) { J! F% ?: I' `3 Q' \7 x
4 ?# c( d5 I3 b* L) l$ y" c int myfuck;
6 u/ B% Z* H$ |% p0 I double yiDuanShuJu_mean;! R9 w( _( [: M+ e7 S7 E+ S
double yiDuanShuJu_LowMean[1000];! E1 W0 \/ \0 K" n, e* z$ P) I. a3 W
int ixstart;
( w. @9 y+ h1 Q/ D double dv0[1000];5 V7 K$ A2 L* t& v
comm_AGC pAGC;
$ f6 P4 D3 M* h% T2 z comm_CarrierSynchronizer pFineFreqCompensator;2 ~/ S/ Q' E: z7 F9 F! \
dspcodegen_FIRDecimator pRxFilter;
; J: \) M8 B5 \ comm_SymbolSynchronizer pTimingRec;
# x4 K1 q3 B' o! X7 V' I; \ comm_PreambleDetector pPrbDet;
% I6 a1 k& y* I; r FrameSynchronizer pFrameSync;
1 j6 |: o3 _* F+ p% m1 i) _- ~' g$ Z QPSKDataDecoder pDataDecod;
- j" F* B4 Y v0 k# Q static double usable_left_filtfilt[81000];& k A' i1 G! F. l$ p
static double youXiaoShuJu_QuZhiLiu[81000];5 i" w2 p& l( M. E# r" P, [0 Z% E
double mtmp;9 z# d0 j( U: v# P4 C
int ix;2 h# u8 U+ I) d* S. z$ t
boolean_T exitg2;
+ K, p5 j C! |' X3 Z8 t% I boolean_T exitg1;$ _; I9 J }, L8 M9 M, Y
double YiZhenShuJu[800];
. i6 M. D- n+ l% I double dv1[800];
0 I( s# e, u7 |: g% ~4 B+ ?% a1 i7 L u
; N7 R: W1 c; @
double b_YiZhenShuJu[800];
( j( c! Q' B$ q! `4 a+ C double I_filtfilt[800];+ t* |6 W/ w( T& Y' ^$ r6 |
double Q_filtfilt[800];9 D' P( Z0 l8 `$ p' }
creal_T b_I_filtfilt[800];8 s- j" C3 t" Z
creal_T b[800];
& Z+ X: G% t8 @: } creal_T RCRxSignal[50];4 X* f1 _: b$ i9 C
creal_T fineCompSignal[50];! {8 r7 W; n H9 [& f
double phError[50];
, I" J+ F6 P. j } creal_T timingRecSignal_data[28];
, G- o3 m! i1 K8 b: L3 p9 A int timingRecSignal_size[1];
# c6 X7 W# j( ]+ ` double prbIdx_data[28];
2 i: g7 [% ~) M U int prbIdx_size[1];
3 }9 r7 \% O# P& s5 e. o, n8 X double dtMt_data[28];$ T* j0 B+ M+ N$ O1 }
int dtMt_size[1];
) Q7 ^+ a, ^0 D' ?) x* W creal_T symFrame[25];* }$ T- H: w; b/ P$ @9 E- c* v
boolean_T isFrameValid;
+ f8 i8 F$ q- a- R8 Q( q( g double unusedU0[3]; O. P( l5 K. ?7 E
& @) d3 A7 u4 d) h% w; R" e //调试过程中的变量
" Q: E# A: v6 `& j0 d int enough_data;0 y4 _- R7 U5 i) }& S$ r
/ H4 p E; z' c; }) Q' {/ K5 P int enoughDataFlag;" {1 c. \8 }& Z
int yiDuanShuJu_mean_int;
8 X7 n7 E: j1 s3 x int int_sum_dv0;* J5 z% o3 r& v n5 G9 ?3 @' t% l% B
int oo;
) B5 O# v% c/ S. } int ii;
( `% l, P$ @$ r# Y4 w6 F myfuck=10;
' D R* Y3 L' ?" H5 i /* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */1 p, @5 }: F' `! u
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
( t: y8 S9 @* k, K% t
( W% K8 b. @$ Q9 b) _1 M( U$ y8 E yiDuanShuJu_mean = mean(data1000);
2 v! v+ d" G1 h( k" ?
+ x) e1 S" z0 ^2 V: x yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
6 ~5 y# Z) f2 P( r UARTPutc('A');* c' p9 {* u9 B }" W3 v
UARTPutNum(yiDuanShuJu_mean_int);& d# p, {* ^+ g0 {
UARTPutc('\r');. }% i8 T1 y$ C+ c3 A
UARTPutc('\n');+ i& l2 I9 Q7 c+ B. a9 k* s
n0 E+ r+ }+ e3 m for (ixstart = 0; ixstart < 1000; ixstart++) {* D/ { P- V. X) s+ v2 e
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;6 X2 Z8 }3 l8 d6 N5 l
}5 e/ q# T6 L7 ]# s L0 E8 |; D
. X7 ^ Q* _, Y' z) v" T power(yiDuanShuJu_LowMean, dv0);
5 [ y k ?; C" A4 Q, A& W
; n, |8 z4 l/ y( s" m int_sum_dv0 = (int) sum(dv0);' }# W, Q1 D4 K8 n, }' B& [
# Q+ _" q- n3 b6 s$ m+ A
UARTPutc('B');
7 M5 Y% @; O- i8 n, p' l UARTPutNum(int_sum_dv0);6 u5 z. d0 j/ G' n0 I/ Q
UARTPutc('\r');! ]1 B: |+ Z- h% [
UARTPutc('\n');
d/ |; e2 v" y* A+ {
8 i [) }" r5 J$ L1 q$ P: X// int compareFlag = int_sum_dv0 > 1.0E+8;
& V! R2 c. A* H; ~! i) P
; w, } v8 R8 c. T3 _ if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?# a( M9 M. Q. ]# [1 A1 o
UARTPutc('C');. M7 q3 t+ |" q9 z2 f0 d9 t: |+ p
/* 比较信号能量 */7 U7 F4 J( {5 K) z
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */! E0 X: W0 K2 \! N% J5 v+ l3 w
// yiDuanShuJu_mean = 1000.0 * youxiao_k;
) s( D! e( @& q7 H' ]7 R$ J+ z// for (ixstart = 0; ixstart < 1000; ixstart++) {
* A& |" h% V1 ^. }// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
7 z3 f1 _4 l3 G9 b// yiDuanShuJu_LowMean[ixstart];
. I( l! r5 N) t$ |0 a* z// }
( b0 w5 }$ J9 Y8 e' U) ]5 l//3 J" l: h; D! F( x* t5 j% `
// youxiao_k++;
# m0 x1 S) G) }0 b- R+ x// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
1 p9 v4 d) w" Q' R, I. E// /* 感觉要取21个数,即0-20, */! v4 q |# N5 Y U! q
// enough_data = 10;//有效是10,无效是0: u& _' I- w1 P0 l( `$ Y6 I4 P
// }4 m: T/ O0 T- d& M
}7 e9 T G! b# |5 O, W
+ L' j9 v9 _8 ~$ l0 a2 Q: d6 R: K' K2 f9 q; b+ `, Q; D
enoughDataFlag = 100;
$ I* t! }3 t5 I6 W* J/ \ z enoughDataFlag = 1000;
! D8 M f; u" v/ e d# l enoughDataFlag = 0x02;+ H; h) X% G0 G4 G
enoughDataFlag = 200;2 t! |* i# \1 X
& Z; r- r: n( h
int myfuvk1;
3 M8 j2 `' K1 T myfuvk1 =11;
6 m8 A/ ]! d( `' B4 a$ G# q" i! H7 u. r
+ Y! r: ?" h: C' e: i
enough_data = 0;
' S z1 f, ]( B3 o8 c6 J7 A2 t
( v" M% {9 b8 E/ w9 I* U// if(enough_data>50){6 {2 J, x5 B% Q) T+ y# @+ o/ c
// enoughDataFlag=0x01;
3 A, g& ?3 i5 }) c) I% g9 S6 p// }else if(enough_data<50){: C: h/ o% k9 M5 ^: }' S/ h
// enoughDataFlag=0x00;//0x00还是不行
* P5 v7 g! G: T// }
, f* }* {+ J* P5 m* s- [8 p8 M ?) P! q5 S
+ Q) Z/ ^! R# B: `' K O( z
oo=10;
0 V) j! _( z' a6 X2 ^) t oo = oo < 5;8 W3 [! t1 V, u9 C. s: r
if(oo){; Z; N7 }7 s4 h* _
ii=0;$ Z1 l% B) x4 r, Z
}$ q' v I8 f2 r9 m$ r$ V3 W: J/ H* a
if(oo < 5){$ b5 ]$ ^ F% l: U8 M
ii=0;+ T# k) x& r, D
}
" O) h. a" R. v K# n if(oo > 5){
( L1 T5 V9 E: l' z# K ii=0;
; Q7 a* h: f, M3 Z& P# Q9 A/ L5 O }
9 t) e, {( g9 u, {9 A) S+ {1 ^) i) O' P
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */* g9 r; p" t3 k0 b1 [, ?! v
/* 如果数据足够才执行主程序 */
/ ~" D4 U% r% `" R3 Z3 U8 l' a oo = oo < 5;
" p3 M- T! O+ T enoughDataFlag = enoughDataFlag < 5;
3 ~0 X/ M% j5 x$ Y if (enoughDataFlag < 5) {
9 h- D) l( u* |8 M* Q6 q// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
% ]2 q! M! m/ z, G: u& \ AGC_AGC(&pAGC);+ |+ `$ e8 @# A
$ X' Y7 ^6 t5 Z% Q, Y0 T. t6 Y c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);+ ~9 V4 I# J S0 C' M0 k; s
FIRDecimator_FIRDecimator(&pRxFilter);
6 k4 j9 T G7 ^3 ~/ Q" F0 F& p
$ N7 B2 q0 i1 N, q1 V) D8 l /* Downsampling */
- E% h t" @% V2 @1 [% o c_SymbolSynchronizer_SymbolSync(&pTimingRec);" Q; o2 Q1 T, T
- _. q3 f4 e! c& A' c0 u c_PreambleDetector_PreambleDete(&pPrbDet);8 n; \; T6 B! y6 O3 _4 ?
: {1 l O- n2 A+ e6 c! k /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */. u1 X4 }$ ^+ I, {# P( B
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
1 \# ~) B# E- k2 R- M) R F /* %帧数量=100 */
: j0 X( g! B" t pFrameSync.isInitialized = 0; j. P- B: @5 Q! U
/ }/ n- B2 f$ ^- r /* [EOF] */
2 B; d( S) C) f. U' n /* 前导码长度是13 */, ^# c, k% }. f+ ~! b' m( }
/* %qpsk */
4 Z6 e+ C# k. O# | pDataDecod.isInitialized = 0;; p# j# W6 ~9 [: [: B) i- h$ _
0 N+ p. u/ A! E$ T/ q /* end */
6 y& O _: M5 h+ C$ E( a /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
' @4 w6 ^4 x4 Z6 X& ^ /* Convert 3-dB frequency */
$ c! e" Q: G8 f, P. ] /* Convert 3-dB frequency */
. A/ z% j# r8 z& h4 x filtfilt(save_buffer, usable_left_filtfilt);" c0 s& n( }# s
for (ixstart = 0; ixstart < 81000; ixstart++) {
9 x% r* G' L. A8 O6 q* c1 l% r& P usable_left_filtfilt[ixstart] *= 2.0;
+ Z, [" x9 U0 v: O }
8 G F s g* R. k; P. n( U
3 [4 F6 M& X) A Y; K2 Q, F9 | /* 注意乘2,处理幅度 */; f% l+ e2 B9 r& H' O1 L0 J/ s
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */
& I) B6 f: B7 m$ R /* %% 行列转换 */: t" C* F* R K( b* k3 z2 p6 P% W
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);: z: r( D7 U+ e- i! Z
for (ixstart = 0; ixstart < 81000; ixstart++) {7 o$ t0 u0 `% p, @$ T
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]: X; l' } {, @: {) q
- yiDuanShuJu_mean;
* e- k- t9 y' O0 [ }
" a9 r' n8 b1 y3 h) o0 ~, I3 ^
+ A: `) p; r- O /* %% 应该对数据归一化,但是这一步放在哪比较好 */
1 O! N: Q" v) x- D% h ixstart = 1;
; Y$ M) P' K, T- h( T mtmp = youXiaoShuJu_QuZhiLiu[0];5 n% W3 Z; p8 a% H
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
) c9 H+ T" z: G# b5 K6 `$ m: x N ix = 2;
" J, }+ s7 T) `5 f1 D exitg2 = false;/ T' y v+ y6 F! K8 M0 g% g
while ((!exitg2) && (ix < 81001)) {
h, `+ X; M. s+ j0 G% F8 X U' ` ixstart = ix;
$ x, [. \; D5 ]1 [* M$ ~5 H0 N if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
4 d; W2 s& f4 V ]2 Y. b mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];6 {% o' F* X% C, _' `0 i
exitg2 = true;; H! b0 ?+ \7 Y
} else {
- ^; u+ U* j+ R ix++;
' b/ `5 e3 [4 D! C% Y2 D) I }
$ e( [& y2 U' L5 l! b% l }4 D- s9 z4 D4 t' `
}. V2 Z- G+ p d6 Y- I* ?8 d
0 v; d; ~! X; }( c; F! g if (ixstart < 81000) {+ Q) Y8 ?( n1 L6 ]: Q
while (ixstart + 1 < 81001) {
4 ~; F/ p- Y, n6 `* m) m0 ^& _! }4 x if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {; B! ]1 T( ^9 J2 M
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
& v o+ X8 \3 _ }
F: m5 E! s; O1 x/ X# D+ G- p0 t N' K! R9 m5 E* K( ?
ixstart++;
; O& q9 o: j, v: r4 @" F* A2 Y }3 r( ]# U0 A5 N2 m
}0 A$ I4 V2 m. s3 M! e
$ B+ w( y3 u# w
ixstart = 1;4 s! I P! }7 {$ u9 I9 i) n
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];& Q- e8 J6 V% y, G) _) h
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
; } Q- S' h. Y' U. s ix = 2;
3 X* x# J9 U3 z+ U8 c& l1 J! x0 b9 B. y exitg1 = false;( Y/ H) L0 [* f/ q+ o9 ~. z9 C
while ((!exitg1) && (ix < 81001)) {
4 D A: C# P- W% [8 \& D" ~' u ixstart = ix;
/ X+ B( ?, G9 a& e! E/ A if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
3 @; {/ F0 d3 O1 O. `' B2 F yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
- F$ E5 }3 j% n. w6 H w exitg1 = true;
3 V" `- \4 M' H1 \: E( d } else {0 b5 H& v& }7 y# F/ _
ix++;+ u& \* }. H9 ~9 d! H' x: u
}3 a" c2 R$ D- m% H! Q$ X+ j
}
' ~/ g9 H. s( S5 a2 C# E }
8 i+ Q& @7 R. U6 X k6 x7 e2 B- x. `+ d
if (ixstart < 81000) {, ]: V# o1 H9 x9 P6 a' T
while (ixstart + 1 < 81001) {
- ]* k# N6 I/ Z' H if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
% W9 y9 S3 N2 ?; |; [! O" K" q yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart]; N' ]0 G5 R* ~* A2 `
}
7 d2 W5 U& G6 }3 F
8 ]$ m- X* ]# Y% e) F- u ixstart++;
; |4 m5 X$ I! r* ] }
* Q% e# T3 M( Y: ~1 G( Q* r }
% A5 d; A+ r/ e0 s# t& A7 y% P
/ L) e4 R2 p$ ]4 B5 o- j& j. V yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
0 N; o/ A+ C% F if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {2 M* E# x! H- r" F+ M2 |" @0 R& Y, l& T
yiDuanShuJu_mean = mtmp;3 i8 _ s. v( L# N( a' N
}5 h2 f8 P' b8 d- @' z
7 F$ L; D/ z# D6 h7 j% P1 L q1 N /* 找出极值 */% @ U, @/ M( M; ?3 @' k
for (ixstart = 0; ixstart < 81000; ixstart++) {
4 f$ n: h" @7 E8 _8 e' S& f# z; m9 d4 R youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
, A( A! N" R( G+ H Y+ c }
" T$ `+ f" T S: V
: N3 Y" R4 h% R1 V9 }8 Q: I --------------帖子字数限制------------------3 M- p3 `4 K e T
}
7 ~7 z) l" d/ V+ ^$ `2 p" P, D ?& ]; b; z4 k
: J/ N9 H/ Z" X4 V! h- K } |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|