|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
) r' x3 I% i- Y: ~% _
9 y- k4 W* ~* ^- Z# I' n! a各位大神:7 r y# N* T0 r- R7 |
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
" R7 g; }! e. l& G4 I) c 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:7 L- i2 c- z- U, K2 ~% k, W1 m! Z
" u; @$ K& A1 O5 {/ y, R& r7 K
1 n* j' o9 c T4 W& }$ k这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。5 F8 E0 A- V, h J
, `; f0 L$ r/ ^8 R并没有其他线程
# P: O1 F5 i }1 c1 t- V反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。- I% r4 N2 B! [2 @/ E0 ~
也说不定是和堆栈有关系。。。。。。 N# H* m5 ?( G1 U. H m6 n
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
# a' y) q. d0 p0 M2 g
5 {& w2 P: E7 e% F/ t9 T1 f+ u
1 v# f5 _$ Y' z* m( N( v/ z. V+ s1 l6 d$ m
我也很绝望啊,希望大神能帮帮忙,感激不尽,!0 @. h+ f' ~" Z6 H; y
2 p* V S" X: B) f, J; C, S+ g5 }0 E
% @% P0 h6 p3 ^
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
* D" R3 I( w7 B# [/ m static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。! f2 Z- S b3 z9 ~- B6 Z
5 N6 J& l; Z+ \% u6 t9 n Vboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
! P d6 ]+ S$ {' l7 b" W const double data1000[1000]) {
8 d Y3 f5 j5 A* u' O9 n& U6 T: ~3 M2 W* H4 ^! G* j+ K6 p
int myfuck;# o; s, @! y) V0 U
double yiDuanShuJu_mean;
& c4 h; B) O) r- e& T7 f# G double yiDuanShuJu_LowMean[1000];
! k J/ [0 p. |9 V& j' ? int ixstart;
$ o' [/ J, k: J1 L, i7 C) {6 L" k" c& `5 O double dv0[1000];* |4 m3 Z* _4 c6 g
comm_AGC pAGC;7 S& \* ^) W/ x6 {% L" c
comm_CarrierSynchronizer pFineFreqCompensator;: @' Q/ B6 y4 F
dspcodegen_FIRDecimator pRxFilter;6 h; w2 d7 v9 ~ \) V
comm_SymbolSynchronizer pTimingRec;5 t5 L- t( e* s4 \6 M0 C4 @( R
comm_PreambleDetector pPrbDet;
! c7 u7 Q/ o1 N ?/ l* F/ j FrameSynchronizer pFrameSync;
: c. |$ V( ~" R' \& U) h% d% d8 e% G QPSKDataDecoder pDataDecod;( l$ M! g. x# O/ b& W
static double usable_left_filtfilt[81000];
& E# ?1 g g8 d! ~) K static double youXiaoShuJu_QuZhiLiu[81000];. m; j( J- |$ [3 n& q
double mtmp;$ m D& P! I4 M& o0 D6 p
int ix;4 Y9 L) f5 C4 p- d% d. g4 Y5 X
boolean_T exitg2;
8 h% g3 [; H4 g/ \2 \ boolean_T exitg1;
8 l+ X4 S1 k" D' k% E double YiZhenShuJu[800];
: h5 S! ` P d, l3 U double dv1[800];. w) H5 Y; B0 w$ W8 d1 m
6 g, L! k9 s! Y" W8 O2 L% O
9 F& H1 c6 V9 c, Z! H, C+ K9 S double b_YiZhenShuJu[800];9 g# G" p) U* K" ~3 y# k% _
double I_filtfilt[800];/ v' \% `' ?, s$ Z6 P$ b, X# _) Z
double Q_filtfilt[800];
8 y2 P% [1 r4 o& h! V4 ]# v creal_T b_I_filtfilt[800];
. H+ S& l( ?3 e creal_T b[800];7 i& ~- E, J4 A9 N3 c; ]
creal_T RCRxSignal[50];: H6 t+ {+ L: {" @. x% C' S
creal_T fineCompSignal[50];8 u4 Y% D2 G4 p
double phError[50];9 i- u6 k0 j0 Y0 Z- R
creal_T timingRecSignal_data[28];
( {( k" B M8 l! p0 N int timingRecSignal_size[1];7 N. z6 x( S2 R" l
double prbIdx_data[28];
# m9 z+ c8 t/ G3 C- Z int prbIdx_size[1];+ E6 g. p& P) @/ Q* J* |0 `
double dtMt_data[28];, r: M6 ]1 d6 W8 M
int dtMt_size[1];$ G& ~1 }0 W8 a5 ^$ P( c/ S
creal_T symFrame[25];3 p6 E' m7 n9 s; g
boolean_T isFrameValid;* u$ Z3 h( p( P. u% M
double unusedU0[3];
1 f6 Y! j) f/ a0 V# \6 ^
! q" |6 _+ |/ ~6 N0 S8 s //调试过程中的变量
1 J# J& V6 }4 q int enough_data;# O- D9 d% J0 q6 |# E1 _- j4 c
/ T& o0 n: x. {# d: J: a
int enoughDataFlag;% i1 T3 s# n9 E- u& t* {) p8 `
int yiDuanShuJu_mean_int;; L7 ~3 a" `- T+ D3 B( o5 D' g- n
int int_sum_dv0;
- `$ s, e1 A9 }, N7 ] int oo;
! X6 J1 ?" }9 v9 a: ~# Z1 r int ii;" { @: P' o6 p. b1 U! Q4 D
myfuck=10;' x" B c2 F6 v. b$ D
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
, u) G6 I- p& J( P# U/ O /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
' r0 ~2 I$ S( X7 @$ m0 b
. T) X) U. _ Y2 X yiDuanShuJu_mean = mean(data1000);
, `# o. j, k' M. \6 [9 ?9 E4 R. z+ Y% r' ~2 s) n, a! L1 ]- u
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;- \5 r$ ^" Q7 m
UARTPutc('A');
9 m0 S" c& u, ]1 L( }- v) | UARTPutNum(yiDuanShuJu_mean_int); e! Y! |) {, H6 F
UARTPutc('\r');
1 H+ m$ g0 Q. ]! y UARTPutc('\n');$ ?! d X3 a6 c' t% g% O3 j$ ]
1 m4 N2 }# o" z2 K k for (ixstart = 0; ixstart < 1000; ixstart++) {
# M: x1 E, t% y# c0 B, g yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
/ Q7 ] s# y2 q" [- k3 @+ s; D }
: |9 S# U: D6 o* `) O7 v
* R/ ^* U: `5 G" T+ n' [ power(yiDuanShuJu_LowMean, dv0);
, b; q- V. c1 m1 j% ]
* Z. l; C8 `" |+ ?9 \ int_sum_dv0 = (int) sum(dv0);; w+ B; ~3 v* Y$ K7 d9 {* v. F
' `1 O6 }. D( [$ b9 ~- c UARTPutc('B');2 _, i+ N0 k. l. [2 x' E
UARTPutNum(int_sum_dv0);$ U4 d; _7 c6 S% Y, A5 p8 N/ Z
UARTPutc('\r');0 G3 @$ L) ]0 T8 {; ?8 ^
UARTPutc('\n');. l" D H2 t3 E: y4 x9 l, X' S+ t
B5 B: x% Q R5 h: c
// int compareFlag = int_sum_dv0 > 1.0E+8;
) f- {# G% {: x7 c7 j: q) l. b# m, Y$ @
" R6 Z8 @. F# z if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
5 }3 r( M0 z5 P1 ~2 D$ _! f' m; L% W UARTPutc('C');
6 \/ z9 {) C3 ?# E /* 比较信号能量 */
' w A& o. ^# ~1 L /* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
7 s2 u, z( v" c" D# m h& s' L// yiDuanShuJu_mean = 1000.0 * youxiao_k;* S' x/ w6 l: U& B$ v
// for (ixstart = 0; ixstart < 1000; ixstart++) {
9 m! \" E P9 |2 e2 ?& b3 h+ l// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =& V5 V1 n' G) ^8 J
// yiDuanShuJu_LowMean[ixstart];
) w/ }" q( j9 }) t// }# I; q" v5 L* F
//
- N* {1 F4 W2 o3 _3 ]: _& s: E// youxiao_k++;
6 ? l( B) m) j7 w) o// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
' {& \) W& o% U' n y// /* 感觉要取21个数,即0-20, */
9 ^5 N( _6 W- Q' t// enough_data = 10;//有效是10,无效是0
0 U- p" x( |1 X% Z, ?1 N// }
1 e4 _5 e; g$ Q( K }! x% M! W" o/ r/ o
: ]% ]1 u6 i# A; g" d
, o/ s: ~; P. Q8 s0 a2 g enoughDataFlag = 100;
- @9 a# {8 |8 x6 }' Z enoughDataFlag = 1000;* @' S, O9 x O2 U- \* U. S4 c+ y0 O
enoughDataFlag = 0x02;
1 F# `+ \6 k) k* S' i enoughDataFlag = 200;
F* {9 _4 {! A
7 h- @' D4 s& O; n; o' E int myfuvk1;
6 n; y2 ^! k& z# u1 {+ ?2 C0 d myfuvk1 =11;$ N" J7 f2 }; w
6 i- C5 C" K0 o0 L* z
6 \, t4 a' ~' E* ]4 L: b) | enough_data = 0;
- o: U6 G* U9 ^5 E, K' x: k/ [; a+ M) D, w; U
// if(enough_data>50){' n$ z' ?' j. g" k5 C
// enoughDataFlag=0x01;
+ F4 Z0 G( h" M// }else if(enough_data<50){# K5 B7 \% X! Y( g. k
// enoughDataFlag=0x00;//0x00还是不行3 ]6 t' p& e6 j3 R! m
// }/ L. g5 n! F" Q) O$ E
& t+ b; ^6 W; \) X
6 q9 o8 m, v/ N3 o2 B0 T) s) u oo=10;
) \0 ]) f+ {2 {4 @+ o oo = oo < 5;
9 z7 x" |( x9 F( o if(oo){( f) j/ J) x/ I2 U. K: i+ g
ii=0;
4 S& P& c: f( `) A3 C% O }
! c6 k: u/ Z" y+ b if(oo < 5){7 G# L; |* ^' g: n/ Z) I# K
ii=0;2 V w6 ~7 g& p% \
}
, n' O0 n+ S3 J if(oo > 5){
" r" K H* L* u& ]- k ii=0;
. c$ \3 r, s! P6 T }
# R. N! J, \( u
2 b' f0 S" Y7 M& Y% y /* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
) c1 N. M6 Y2 B( y/ W+ D /* 如果数据足够才执行主程序 */+ _% a7 a/ i: T) Z7 e* S
oo = oo < 5;* p$ q P+ r0 ?+ ?
enoughDataFlag = enoughDataFlag < 5;9 r' g/ P; u7 n/ G* x i
if (enoughDataFlag < 5) {9 v/ M3 i: \0 r1 A& Y- a' N
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
1 b9 K/ P* Q8 a$ {0 L AGC_AGC(&pAGC);" e0 s, }9 Z8 ]
3 F+ k; J9 e! o/ C6 X7 ~% w c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
9 j( }8 [. w1 Q* _) Z FIRDecimator_FIRDecimator(&pRxFilter);
/ Y2 _% X- p6 S* o+ P7 _6 ]5 C% I, T9 v6 n/ _, `
/* Downsampling */1 d! v& q+ d3 e2 w& M9 j- G/ f/ D+ p) z
c_SymbolSynchronizer_SymbolSync(&pTimingRec);
9 f& I5 g) p5 O6 S8 @0 d3 F# n8 B/ ?9 E0 v
c_PreambleDetector_PreambleDete(&pPrbDet);
5 S. M- X7 z1 H7 T, W* d2 F3 f1 w% x7 |1 ?
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
4 `0 S$ Q z" ^& x5 X# r' p$ e /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */8 \$ b4 [6 h. m' ]/ r& k/ G
/* %帧数量=100 */2 D" J3 Y" {( l5 F
pFrameSync.isInitialized = 0;8 A- e4 D. b! F* A" f9 U
2 n7 E d G3 i N; y /* [EOF] *// ]& K3 t5 n6 B6 k
/* 前导码长度是13 */1 [: v9 D5 r1 s6 w
/* %qpsk */2 _% Q( c4 f1 n
pDataDecod.isInitialized = 0;+ S6 v, W( e/ m# p! K
- x1 P' B1 V! T3 {6 y
/* end */
8 M" U9 j; B* q; v& G- O! N /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */3 j5 t: L; j d* U& }( m/ E
/* Convert 3-dB frequency */
* ?% y4 n! S$ o2 L /* Convert 3-dB frequency */. l. t2 B0 U% B
filtfilt(save_buffer, usable_left_filtfilt);0 V6 v. g( t' z( k% |+ W
for (ixstart = 0; ixstart < 81000; ixstart++) {; W, l) l% Y) D( f$ p% x
usable_left_filtfilt[ixstart] *= 2.0;
1 p+ Y" v- m/ H }# q2 Q4 U* s$ l0 h$ u6 l+ l( h
) V/ {) W( _8 |, v! L2 {) h- A
/* 注意乘2,处理幅度 */
' X$ t: o# C9 P# J /* %% 我发现带通之后其实就均值为0了,不用这一步了 */
p4 W5 ^9 H3 T /* %% 行列转换 */2 X9 \( x9 @& V& @6 o
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);* S8 }! }3 \ g+ l) e
for (ixstart = 0; ixstart < 81000; ixstart++) {
( D t5 T T! S# T/ }8 r% R youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]' h6 S2 M% h* [2 Z3 c [8 x" i; ?
- yiDuanShuJu_mean;
! k4 |$ u" K" g* |0 M: x4 I4 X: x. d2 H }
( j! @( D; z% U( t
' A# v; |5 ~5 S: ` /* %% 应该对数据归一化,但是这一步放在哪比较好 *// O, B) m: c. M M: B
ixstart = 1;0 Y; d8 f: S/ `+ v0 P& G5 j( Y
mtmp = youXiaoShuJu_QuZhiLiu[0];
0 G( x4 c0 v" a% f' p7 t if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {5 K1 q7 o9 I* z2 h7 M
ix = 2;
8 Y3 D$ k& S" x2 e9 T! y+ f exitg2 = false;0 l6 N) G& t+ ]9 e& O( O$ q
while ((!exitg2) && (ix < 81001)) { _( k+ j1 s+ [, Y3 C
ixstart = ix;
1 d) ^! n. I8 ]4 n+ s4 R* s' g l if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) { M/ P/ q* Y! E. N
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
: ]$ ?1 u5 \3 ^; l, E1 I" \ exitg2 = true;
" N) _( @8 I- E } else {
* s7 ]" @- F/ z: t) \+ e3 n ix++;$ N& u* ]6 D" e, j+ s4 q3 V
}
6 X/ p' R+ K9 i( x6 r' e }
2 t: \" | d2 P: c: W0 Z5 _/ [ }1 C$ C! t, [& C0 F9 e- s) v
t/ H, i& X, `2 n8 s" @0 f
if (ixstart < 81000) {
; @4 @0 z! k) O3 P# ? while (ixstart + 1 < 81001) {
% z3 L! g8 U! K5 m/ l if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
9 X8 c0 N. c8 \- S mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
# p) n0 K8 J- ^1 u. b2 p: `! A }7 s% j. N* h1 }. F4 U* H" x, o: ]
& Z2 L0 o) C' u6 z, p+ O: _
ixstart++;
1 ~* y, n* Z% x. {& X$ @3 [ }
. ~2 D' ~; v# f" h) U) A }- S: H e% [. I+ R+ j
+ j, }" A( R* ]4 s/ n4 u0 ^* x. w
ixstart = 1;
0 v4 T/ i$ z: h; r6 k1 K yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];0 Z6 K) W! N) d, x5 |: H
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
! M- |9 t& @' a E% R% t( J; r ix = 2;0 g6 b/ a7 n$ e4 }0 F& |7 D
exitg1 = false;
' M" P4 o" V8 I9 f0 K4 P) [$ }& I2 f: m while ((!exitg1) && (ix < 81001)) {0 ?' F& z3 S; R, f/ o
ixstart = ix;/ q6 u3 X/ l$ s2 z# \( u; K+ W
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
8 p5 ~, ]. K$ ^" k7 q2 q; p# E yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];3 t3 x, f6 O/ _7 t v5 V, i M7 N% x
exitg1 = true;# v# I, L; z( b. n
} else {
- @1 p, m4 y- V$ H" p4 W& T ix++;4 H F+ d/ i9 r9 `( W
}
5 T8 U. }/ _: q* ]8 T. } }
9 r+ p7 ~) |- q' j% E8 J$ l }
6 z5 l9 u8 f% c
9 l Z9 y7 }$ q& ]1 i if (ixstart < 81000) {
* Z2 U$ k8 }: D# n while (ixstart + 1 < 81001) {5 ]; A/ C5 e( h. g4 A9 Z# L
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {6 P: M! v# K9 }; d9 s. C0 \
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
2 Y5 l- F- I& p8 z1 H }) |& B$ a0 \, y+ Q$ o, f$ `. K
: x* ?% b/ G0 Q# p5 g ixstart++;
5 P0 n+ V s. o }5 _! ?% }5 P$ R* ~
}! P% j3 M: _" ]3 E0 G
* v$ G; l" u2 c& X5 c) Q
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
( }1 X6 C) p* j2 L9 e if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
, D8 G# i9 v; f7 {: Y3 n yiDuanShuJu_mean = mtmp;
, s6 c! M, N( v6 [ }
, M3 o F3 F* L% K
7 S. z; G5 e8 @1 Y% { /* 找出极值 */
+ C+ E1 F' n5 A- J; D for (ixstart = 0; ixstart < 81000; ixstart++) {
/ j5 u& @2 o" j/ W youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
: P4 ~0 R% t4 E( }7 {( b6 s) M }% s2 w1 |/ V: H$ X
4 N* J4 s( k1 } --------------帖子字数限制------------------
7 ]4 j6 }, b( z7 W3 Y! x( m}
4 r* m5 F" G3 F7 m+ w% ^1 t! k% B* T! o0 T
' P$ y+ k. g7 A! s0 z) s |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|