|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
* B1 p$ y6 ~% q: a( _9 t' ~' I/ b+ P! O
各位大神:
. r6 e+ C# [% X5 ^% f4 y$ Y 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~): j2 U5 n' V; l/ ~
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
- ]- s5 H( N' ?5 F% s% J& z H, Z; ~* M z8 X+ v# L
/ |5 E8 L& R+ d6 H7 [( H- A这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
0 M$ N6 x& x+ Z( S# L6 ^: O
4 ]/ y9 A' u' z9 q. @7 o并没有其他线程
2 P, C2 @0 B' J% p反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。+ g/ x( V& l9 q8 v2 w! M- f
也说不定是和堆栈有关系。。。。。。
3 j' e/ R6 v- @! F$ x& G7 n: N请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
' k5 C) }( }/ b! }9 R
$ t" x) S2 C8 f- c1 O) d% n$ V" p' K8 U* z$ \
/ h) P3 l) A9 L# o0 @
我也很绝望啊,希望大神能帮帮忙,感激不尽,!
+ b4 h' s* w9 X! X g x7 |) }- Q; Q( l! l2 p8 l; ~
! t0 o" i: h, g附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];4 C! }) C1 b* R6 S% W5 N
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。- k+ L* q, z9 x4 |7 \, Q$ Q" m
0 {% j6 W ], {6 V; [1 }! Xboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(, |7 X- i3 M8 W. d) D5 Z
const double data1000[1000]) {
3 v7 g! J, [* b Q7 O- m% D
2 }/ }' c" P; q) f% t( m1 J int myfuck;( J+ I, g- ~4 }3 q8 W2 d7 N
double yiDuanShuJu_mean;
: w; x5 b+ v7 E% S7 {" q5 } double yiDuanShuJu_LowMean[1000];3 {$ Z+ d2 ^, D6 W& B; m
int ixstart;
3 F5 @& x3 O! a# _ double dv0[1000];
1 [8 o3 V5 w p- M+ N comm_AGC pAGC;
. }2 w% n" u) ?% U, O, n; w comm_CarrierSynchronizer pFineFreqCompensator;
! l0 a. }1 k5 H9 R8 R7 \) R9 V dspcodegen_FIRDecimator pRxFilter;/ j* G6 ]% s( m- Z, d; C5 @
comm_SymbolSynchronizer pTimingRec;
' a1 o) r( r& @+ |- |2 }, ^9 ? comm_PreambleDetector pPrbDet;; z. n- b8 s. Z
FrameSynchronizer pFrameSync;- @) {- ~% m6 n* u v& O
QPSKDataDecoder pDataDecod;
8 M4 u) ^$ n% _3 }) p+ v3 O static double usable_left_filtfilt[81000];4 P3 k# Z% \& n! u8 l
static double youXiaoShuJu_QuZhiLiu[81000];
* v2 Y$ f$ _6 y3 W double mtmp;% L. z9 r/ W3 D0 n' G& }$ |
int ix;
0 A/ P2 K' c0 j' o2 [+ i0 X boolean_T exitg2;% \+ E3 ~' e! P# y
boolean_T exitg1;
, @' X) {7 v, g; S/ k double YiZhenShuJu[800];" { F) h* {$ x
double dv1[800];
0 i& B) g& m( U3 b+ e9 \$ a/ {3 v" S/ ~9 e# _8 i% T' c6 z
& S( e6 \% y, M7 D5 B) ?% F double b_YiZhenShuJu[800];4 ]# _( h* @7 @, R/ A
double I_filtfilt[800];
+ r) \+ a( @* N8 L2 H8 [' A double Q_filtfilt[800]; w" V# o1 S" C* h
creal_T b_I_filtfilt[800];
! O3 {4 j) W+ k# @* _0 ~' Y creal_T b[800];
9 S' Q+ J6 N6 x' {9 ` v8 W# H. C creal_T RCRxSignal[50];6 `3 c: h' e1 M, u4 W
creal_T fineCompSignal[50];
9 {6 j$ d! ^4 C double phError[50];2 p J5 L& _! ~) T
creal_T timingRecSignal_data[28];
) b) n! @: N* ]% W( V" ?1 D int timingRecSignal_size[1];
. M- F- G* T2 r double prbIdx_data[28];
& A# r' j' N6 ]4 X int prbIdx_size[1];
' v/ L5 _ Y, T/ W1 F4 H: w double dtMt_data[28];
8 D9 L2 C! U; f8 g! k' A# t8 l int dtMt_size[1];! t* S( j$ Z6 G$ K/ Q7 |
creal_T symFrame[25];
: {% Y4 I1 z/ G$ V- z boolean_T isFrameValid;
7 p2 U2 f$ ?, o* P$ [ double unusedU0[3];4 d) w H. `' ]
: q: H f2 \: E //调试过程中的变量% `' b; r' I6 Y0 E
int enough_data;
; X# F6 }- S1 o! _" R8 Z$ d
/ v5 j& Z2 M( ? int enoughDataFlag;; N. q5 E6 N) p1 ?0 S7 ~
int yiDuanShuJu_mean_int;2 p; z4 ?3 `- {6 P8 N7 M
int int_sum_dv0;
/ }( p- ]0 h/ g- Q8 r3 i int oo;
2 i; K$ N$ z) z/ B0 Q* k int ii;
9 e9 i: H) v# B& ]6 _ u0 X; g. F myfuck=10;
0 i* R9 S; \5 ^+ {. C /* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
; S* Y+ f* n: ?4 e /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */! Z A- F/ }; f4 ?5 j
6 G( [1 S' a+ a9 U& w+ _ yiDuanShuJu_mean = mean(data1000);
; ]% m3 e5 y4 F, Z; O+ Y, t
) b2 L0 M, v/ L r yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
0 p4 u4 F& [4 f; J9 ]+ i UARTPutc('A');/ x+ w, |: M( S
UARTPutNum(yiDuanShuJu_mean_int);
, d, O9 U. ?/ v$ n0 i. [$ D; V UARTPutc('\r');
' R" y; q# ^* i UARTPutc('\n');
$ E4 l! e& I* D% \$ m. Q- c. P$ b/ x: L k5 c( C
for (ixstart = 0; ixstart < 1000; ixstart++) {3 B+ k$ m, z* k# r" W- s
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;3 f4 e' j8 m( C I4 f* j. |2 L
}# A% Y8 }! }$ e, Q; E
) ^2 ^% X! b1 p, ]7 P1 ?1 g
power(yiDuanShuJu_LowMean, dv0);! i2 F' w U2 t5 c0 [
/ x& h+ `' c$ k8 Z5 w5 F int_sum_dv0 = (int) sum(dv0);
+ p/ |: w+ G1 R& A8 v: k' F; ]: O r: i' T) G( d
UARTPutc('B');
+ Z; h% Q/ @: {( `# U/ z2 q UARTPutNum(int_sum_dv0);4 |( r3 |* @, W% U1 m6 I9 Y
UARTPutc('\r');
6 p9 L2 _+ U8 m$ \ UARTPutc('\n');
+ j9 ?2 H5 X9 z/ T3 m7 ?1 ~0 X9 a6 l2 C+ ]" X k
// int compareFlag = int_sum_dv0 > 1.0E+8;
8 x3 j+ G- H4 }9 u7 G( T, O& |
% v4 F" |4 I/ r9 D# q+ v X if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?- A6 k. t* t; l
UARTPutc('C');
^. Y4 c& Y' P5 G6 l# X# M /* 比较信号能量 */! K# Y4 a4 x5 y. o$ G4 b! ?* m: ^
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */8 V' T& C* ~1 c2 p9 l) ]+ R
// yiDuanShuJu_mean = 1000.0 * youxiao_k;
+ ]+ l8 Z6 }, i2 L8 T* z// for (ixstart = 0; ixstart < 1000; ixstart++) {
" p& K: ?8 @0 o1 S/ W// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
: U- i8 l- c1 U9 ?# C// yiDuanShuJu_LowMean[ixstart];! j8 L4 ]* ?% Z6 `* U( h/ J# i
// }' b7 j/ F; Q4 o! O2 y7 Q5 b9 x
//
, D. v. L2 a7 n8 r9 r9 ?2 a) d// youxiao_k++;3 w1 p G5 z B& m* G: Y! G c
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==: ]) W& P$ F, P( t3 o5 Q5 C
// /* 感觉要取21个数,即0-20, */6 }3 f( n" w( S* B; x
// enough_data = 10;//有效是10,无效是0
; `2 x# E! }) y5 M m" g// }
* ]9 o" R$ r0 Y o6 y n" O9 W$ w }
+ O, ~9 O( r. p/ n" [$ A9 G6 J7 M6 H3 q1 k6 f
* {! q" y1 I6 s+ V6 c8 p( h$ ? U! | enoughDataFlag = 100;# ~( l( [" O& u0 L
enoughDataFlag = 1000;
7 u$ @+ z X) Q1 m4 g) r. @ enoughDataFlag = 0x02;* ^ d2 ?5 Z( G4 _- p' Y
enoughDataFlag = 200;3 o7 x# d+ z; k, [. D2 R3 d; q
. s9 c( f- j. J+ z9 S% S int myfuvk1;
4 R$ k$ p9 L8 H! ^ c) M2 s myfuvk1 =11;2 d; B5 b5 o9 J+ W- K
( @. ]( p8 |) \0 Q$ c
* D; P8 P2 J% E! ]) _ enough_data = 0;- L& {4 o, P' j$ @2 k6 H
' ~) H) Z/ R2 h0 x% u2 F
// if(enough_data>50){
S$ T8 p2 y8 F5 W1 v: w% K- f// enoughDataFlag=0x01;$ U+ G/ D7 n* G, b+ M9 G
// }else if(enough_data<50){6 {; s1 r' h; @. a" ?
// enoughDataFlag=0x00;//0x00还是不行
1 D9 M/ l+ l9 f7 `8 z" c1 f9 k// }0 @" h' H- H# C6 J
3 o3 m$ T/ s E; Z/ a8 Z5 Y$ j4 h* `0 k% j( e' P
oo=10;
% P6 I6 x W, k6 ~% U. k oo = oo < 5;5 y, `, M$ M/ {. S3 O
if(oo){. H" ?3 m- O0 W
ii=0;$ G5 p+ S# I! }
}
! ~( B; V! k2 z if(oo < 5){
' T! A" y$ f% l ii=0;6 b/ B( f+ M3 m; J! i- v
}
, ~5 J k2 ?& L. _! p) q if(oo > 5){5 X1 ?# }$ ~ z+ [
ii=0;& L$ X* G( b9 O' K
}( J( w0 J9 i1 t( X& c" n# ~4 a$ y3 b
) u# x$ |, {1 q- }! o1 a6 Q# U
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
7 \- s2 u7 k) h( c: Q7 b: z /* 如果数据足够才执行主程序 */ P/ y- g( U' B0 Q- t: D( h
oo = oo < 5;
% O. x' f+ ?7 l- }; ~- r! o enoughDataFlag = enoughDataFlag < 5;; V) j( X1 ]) E$ |
if (enoughDataFlag < 5) {
/ g V0 s* m8 l1 f* L// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
' J4 x) a- K' d' j3 b7 V AGC_AGC(&pAGC);
3 m% `5 u; M9 ^' m
8 q# |* q; g' R6 Q6 p( z g c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);2 l0 V) l% t. k! ^# m! M
FIRDecimator_FIRDecimator(&pRxFilter);
: ]: _, E8 @& M& D
8 R: q3 Q4 v' X" m% s: q' O; C: O' z /* Downsampling */2 }( G* ?6 A' M6 ]3 N' y
c_SymbolSynchronizer_SymbolSync(&pTimingRec);; }$ |& r, N1 g( L! d; ^: c6 C
# W9 b9 i6 E! ]- B% B" v c_PreambleDetector_PreambleDete(&pPrbDet);+ S0 w$ X( W% ~% F+ T. L
9 Q0 b; f; T9 a% \4 | /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
. z5 Y5 R; M/ z, {$ p! U! i6 T /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
8 Y7 _; Z6 S8 R9 L: ^) y, J7 ?# j /* %帧数量=100 */% D+ Z- v, x) a: ]4 d2 a
pFrameSync.isInitialized = 0;/ y/ v) X7 n9 o/ e/ _1 j9 i
. M& E+ F5 k" Z* `( Z2 u% ? /* [EOF] */
& N; e; F& L9 Q /* 前导码长度是13 */4 N7 J8 C" F8 a! B# r8 N
/* %qpsk */
3 R# ]9 B# y9 j" e) t( Z pDataDecod.isInitialized = 0;
1 ]# O. B. ]6 `2 E$ X% U
- Q: [/ T" J' J" R8 ]: Y /* end */
; n2 X7 b' i; C8 o& \ /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */+ c$ x8 A6 H% Y. k' J# P0 O P
/* Convert 3-dB frequency */% J1 U. T: w0 a6 s5 L1 ?4 Q
/* Convert 3-dB frequency */" [9 g$ l5 F) Z! w" f
filtfilt(save_buffer, usable_left_filtfilt);
: T4 x+ v* i1 D8 B; F for (ixstart = 0; ixstart < 81000; ixstart++) {
( X* \& d; h* [( q' Q$ N usable_left_filtfilt[ixstart] *= 2.0;
: \9 \* ?2 K5 |$ h5 I }3 j4 s' R6 V6 n4 P- Y
2 ?( [$ j8 a; K
/* 注意乘2,处理幅度 */1 i, D3 K: {3 v; r" q: M7 E
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */: N! ]/ L+ F2 d4 p! n
/* %% 行列转换 */3 K0 T* [( Y3 i/ q# t% H
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);( j( g8 c, d7 ^( g- p& L9 Q
for (ixstart = 0; ixstart < 81000; ixstart++) {
$ V _5 G0 G% v5 p youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]; j. p0 p/ v, ]5 C) S) I
- yiDuanShuJu_mean;
9 C. K& s6 P" I3 h, t$ Z- P }. D. d8 \/ f' ?& T# d
2 S6 t1 j: o7 j& M2 W& A /* %% 应该对数据归一化,但是这一步放在哪比较好 */, x1 e) q* p: {7 P( e5 j2 w
ixstart = 1;
U8 K. J$ |& a/ |+ G! {$ d9 y- u; w mtmp = youXiaoShuJu_QuZhiLiu[0];/ N9 `1 R7 n. r! o( T. ?
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
) T$ N) W: i5 ^5 }$ O1 E ix = 2;4 r T+ e6 w- a
exitg2 = false;
/ T; @% J- z$ z( R. Z' l while ((!exitg2) && (ix < 81001)) {0 W( L/ w* d# {
ixstart = ix;. @! N8 S8 }# W/ R
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
, { U+ F2 k% g9 }, |8 W* Y mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];# g, Z( Z& U+ T
exitg2 = true;
; s% f) I2 l+ ? } else {
( Y- H7 p2 A6 a4 Y1 l ix++;; f3 m- k' |; C, i' M' r/ c
}5 D/ W4 r1 S* I1 S6 ~
}
; P$ X( _* J3 A- u }# M5 }8 |5 u' }0 ~4 q
$ Y9 b& Y8 s2 I3 ~6 D0 Y+ f; b
if (ixstart < 81000) {
2 B" K& Z9 M- D# h4 r while (ixstart + 1 < 81001) {2 ^, v9 j1 W* C, T+ u$ y: C
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {6 U# z( P# V5 T: ?9 o; U; {
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
' W1 A; R* R) e) i }$ O6 F4 C2 J4 g% d0 i. x
/ {( j- T5 N4 m5 K* A
ixstart++;
/ s7 Y3 n$ V$ ]+ ]! ~" Q }6 y9 `2 z! `7 z9 n$ r
}( q. _: P2 y, [& d
8 G; @6 _6 e+ |0 ~ Z/ C' Q ixstart = 1;, \! s2 ]8 M1 I5 F$ ^# F
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];; T7 \5 ]9 K% L
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
, a5 [& L+ ?! l; S ix = 2;
6 F0 V6 g$ F% M* T0 g( o( s( T1 G exitg1 = false;
% p; B+ w4 A. M6 {; m9 ?3 r2 n8 r while ((!exitg1) && (ix < 81001)) {# v/ r: t% @; j3 U) ^
ixstart = ix;2 F+ J. F- c6 k/ N
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
$ u$ e8 M9 ?9 d$ e8 j. u yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];; [( J; F3 o( n0 ]8 q9 Y, r
exitg1 = true;1 Z) q3 [" p! D$ u
} else {
7 { Z- }% J# O" l. U( C1 o ix++;9 y# b, | W/ Q0 }+ O7 K" G
}# c5 _1 e1 F9 Z& X% t" t
}
, x/ C7 M5 [4 C }2 J6 Z; o0 p3 R
0 D. c4 ?* q' F& W5 W) r3 p
if (ixstart < 81000) {
* H+ Y: r' ]. c. s( G$ p+ n while (ixstart + 1 < 81001) {
6 P) `. t" m" H( T# K, Q- F if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
1 I+ k! N# l ~( V4 | yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];5 t* ^( d ~# X) Q L8 q
}) }$ r8 l. R/ [5 X/ j
$ R: ^. k' U2 G+ ]1 P ixstart++;
% f) i4 @# ~' g6 w. Q/ n }
' Z8 S( [ O, b2 Z }9 X. Q3 {8 F- I! W/ u$ u, J
1 x2 O) {* J* Q# m9 K2 E yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);& g1 y$ |/ A& F% {, p; x' s
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {" J* m# h1 D. R* `
yiDuanShuJu_mean = mtmp;# Z) X: A- O3 u; q
}
2 H: i# s' J# D" |6 X6 ?1 Q3 x
9 Z& S" l$ E2 D9 v% A% ] /* 找出极值 */
. E8 J0 n2 x1 k7 n/ {2 e0 @ for (ixstart = 0; ixstart < 81000; ixstart++) {4 U4 P- w4 s" @& T* l+ }- W7 P
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;! Q: ?7 U t, a8 w
}2 e, c, y5 p6 S9 j. b6 m
( G2 s+ A3 i$ t1 q/ R+ S. J; b- Y --------------帖子字数限制------------------: R) G2 q! H! x9 k5 |1 D! i
}
6 V: N% @2 r6 j4 k
4 E4 Y" ^5 l7 Y; `& i7 v& ]# B9 F& c: K! T
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|