|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 & K( o$ u2 f9 [. v, {
( F9 Q r/ K$ B, |) E" {: k" z
各位大神:$ K9 |1 b2 ~- L+ c5 \
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~), R3 }. V5 E( \0 y' w' J
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
- L: U( p7 r# i9 v2 W4 p
$ K2 j* c; w2 g+ H/ h! w9 s # H6 q3 N" y' F* S2 F+ q7 L
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
, v' C- V/ }) q+ |. K
) t3 D9 F- L. c5 d3 p4 n并没有其他线程8 v4 E4 h7 Y5 q. b9 f' X. K
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。7 J+ m0 S& q" z- \/ d
也说不定是和堆栈有关系。。。。。。3 y4 K% i& R) B: }1 h' ]
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数..... G! u; o# T$ q# v: Y/ L, E/ L
! D+ n8 D! i2 ^3 C5 z
$ p) j" p) P1 T1 c
) `+ z4 @" {& v我也很绝望啊,希望大神能帮帮忙,感激不尽,!/ n# L" k# ~6 j' D& o
* `+ c& c: I) G2 k- X8 D1 a. w' {; w0 Q9 f7 u# ^ {1 V% N
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
" z) j N* u$ }0 l* B/ x static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。 a) X" C i. c; z7 G1 M
. z" t2 q- H# ~0 aboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
. f. b! U6 a, S! _! {+ r& E const double data1000[1000]) {3 Q( e# b: g# }6 K2 ]" a
5 i: A7 w/ v& z
int myfuck;
& J6 y i6 X" D double yiDuanShuJu_mean;
( W; w6 ~+ P: l7 J double yiDuanShuJu_LowMean[1000];
c) Y0 X f! d, ~# l0 L a int ixstart;
; C. `8 z. A/ t {- W double dv0[1000];
; `" ?- [1 Q% a% o4 ^0 e- J comm_AGC pAGC;
; t' w4 s+ Y! V1 v0 K comm_CarrierSynchronizer pFineFreqCompensator;/ `; W) N# ~0 j3 s- N! u
dspcodegen_FIRDecimator pRxFilter;# [0 S; b: z( }$ t$ ?8 p7 y7 o9 _
comm_SymbolSynchronizer pTimingRec;
% p% s4 m! ~; n( G, D# m comm_PreambleDetector pPrbDet;
9 T7 S& m7 v" W% a FrameSynchronizer pFrameSync;
" I* {; k; g1 Y# `7 R/ Z; i QPSKDataDecoder pDataDecod;
$ y: ` f4 ] O3 v) O/ M: o0 x static double usable_left_filtfilt[81000];
* O* F6 t& p+ K8 V5 y, G static double youXiaoShuJu_QuZhiLiu[81000];
/ Q5 Y7 V" {. X& @/ h, P double mtmp;* N" \8 U" s: ?+ P5 d
int ix;9 p, k1 t" g1 t* z+ V( K
boolean_T exitg2;
$ X: {1 A# }0 X. Z2 g boolean_T exitg1;
! K; Y/ K( b8 ]5 O( Q# v/ [$ N$ s double YiZhenShuJu[800];/ v- _6 {( } s a5 S
double dv1[800];
7 F. T2 f, @: }) d, [1 y
2 p! V0 o H$ C( b
2 E' ]# E6 Y* k2 I" P double b_YiZhenShuJu[800];& X* u! ~$ Y8 k! O
double I_filtfilt[800];( g2 Y; B5 D* q( a# B+ @5 N
double Q_filtfilt[800];
: n- j) t' h: X creal_T b_I_filtfilt[800];2 V7 z* D+ Q4 M3 n: G# l
creal_T b[800];& a% H2 O; U/ c- ~7 a2 K- O$ W
creal_T RCRxSignal[50];
2 _, C+ U! y. Z3 ~, U, T# o4 T! @$ w creal_T fineCompSignal[50];
% F+ r, J& M' Q! d, O# d double phError[50];
9 P7 F4 G9 K4 n) f8 j creal_T timingRecSignal_data[28];% G3 g3 B) v J% m. R+ v- t
int timingRecSignal_size[1];
" A6 j3 T" K. H4 `, M# P: W5 N: o double prbIdx_data[28];
+ R# F3 y* l" o int prbIdx_size[1];3 b Z# n+ e- E) K/ h7 ^; N
double dtMt_data[28];
8 `. r4 S/ O3 @+ G! R: V2 u int dtMt_size[1];
. f o1 m( R. N& M creal_T symFrame[25];: H2 n" I- Q$ V% V4 p5 w
boolean_T isFrameValid;" U4 p6 Q% z0 ^, U3 {
double unusedU0[3];
6 C0 Z7 M Q2 j X6 N% w' ` X* B R# a/ t, a% p) y. h
//调试过程中的变量% p1 D x7 j P. c
int enough_data;2 X$ v8 v _; @$ Q# U1 a0 w
! K6 }* G. V$ B5 \9 w0 M
int enoughDataFlag;( F1 P8 }$ J; r. d" q
int yiDuanShuJu_mean_int;
3 R @5 r! {7 o4 ?+ p" S' b int int_sum_dv0;5 Q- k( x5 G* e6 m" j# y9 T
int oo;
9 W+ L, z0 x1 R/ j* G! { int ii;. S9 v& f) g. z: N% p5 H
myfuck=10;
0 M4 u+ Q/ U' @( I4 X' T q' G2 g3 l+ M /* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */* t, H& J* L9 T4 f0 m
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */* H1 M' f8 t4 a) x/ @4 g- ]
@6 I" S: e0 g; H! I1 h \
yiDuanShuJu_mean = mean(data1000);9 E9 o; d$ [4 {8 `5 f
0 V% v' g1 Z. Q3 _: y% _ ^
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;6 |8 y. q" Y1 @7 r% X1 x: z
UARTPutc('A');8 e9 w% W8 b6 A9 `$ c2 D: Z; @
UARTPutNum(yiDuanShuJu_mean_int);) b0 C+ J: Y3 x
UARTPutc('\r');
9 C0 e. X# ?- ^. l/ g* s/ m UARTPutc('\n');
( r" d2 K- V; Z4 R( K) s1 S3 |* k# U# H& F/ W. _1 |
for (ixstart = 0; ixstart < 1000; ixstart++) {
9 ^1 n4 z: [5 e6 W' t) \* L yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
8 N9 z1 D& e$ Z9 ?( f }/ j: r7 M) e, w, c+ O$ e
4 C! N2 @4 ]. N. M2 \4 l: x
power(yiDuanShuJu_LowMean, dv0);+ z0 e! i% z" v+ G$ h, j
- [7 d+ M/ |( P0 y5 ^2 ?% x
int_sum_dv0 = (int) sum(dv0);
; V, ~. J7 }# i" u# m! h* K9 V, U5 P. S0 _; D
UARTPutc('B');; d1 o9 c/ Z) b) `7 [" X, I' a$ H
UARTPutNum(int_sum_dv0);
0 ?9 j1 p8 I% ] R* K' X2 J- h0 j UARTPutc('\r');' M: p% x0 C* j. J( h1 k4 U3 l
UARTPutc('\n');% n) p9 N/ o: [5 u R
9 j4 I2 r) p' W* z- i! P
// int compareFlag = int_sum_dv0 > 1.0E+8;6 l3 r1 N4 b( d5 q4 n5 c
o/ B3 r$ C1 U2 o2 Q* w+ f if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?" q J/ D% k# J. C$ M, K, P
UARTPutc('C');/ u F) p0 n) }1 O. ~
/* 比较信号能量 */
" d7 z5 d: n% b /* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
+ p) I# b, P1 H* A" B% ^1 m7 v* V/ e// yiDuanShuJu_mean = 1000.0 * youxiao_k;
9 s6 M' G8 U+ @0 K" k// for (ixstart = 0; ixstart < 1000; ixstart++) {
; i. ?& w2 j# U6 T: ]// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
1 k3 q" P3 t5 F+ O' G% u// yiDuanShuJu_LowMean[ixstart];5 K% Q1 u0 m9 R
// }) U M$ f. X) }
//
. O: J+ \0 M* `6 ]// youxiao_k++;
1 F. @( l5 V7 ^8 E6 Y0 d* b// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==1 B; v% o: q/ O- D/ W5 ?2 P1 R
// /* 感觉要取21个数,即0-20, */
1 @- V! S- v! G8 Y9 h8 Z// enough_data = 10;//有效是10,无效是04 s0 q, F, V; r2 [1 U. K
// }) v- v& I4 V6 N3 Z
}
: y- W2 W5 V( G5 ^$ J# I# ]) M p: W$ T& E/ Y' ~! C E. u
- p7 v: r2 V: }" J/ G enoughDataFlag = 100;
7 Q, q3 ~1 S. c/ G enoughDataFlag = 1000;+ o0 k; c3 J5 j+ n: k6 f
enoughDataFlag = 0x02;! q% ]2 w3 v$ V; P$ c
enoughDataFlag = 200;5 \ s9 Y- M. ]
S N7 Y$ D: {# b! o, ^* i
int myfuvk1;
' V* p* i: F7 ?3 h myfuvk1 =11;
8 I. N2 r- u# T. Z7 q4 I+ V) `3 m. s5 a/ Z1 d* G
: h1 N* n5 e; M" G+ q& |% R enough_data = 0;5 P8 i5 G: u. u
: V5 A I, Y8 R1 C4 Y- z$ X$ J4 b; N
// if(enough_data>50){( @" @$ K4 K& O5 ]* x; p
// enoughDataFlag=0x01;
+ D! r& G* ^/ y [9 ~// }else if(enough_data<50){, c$ M" I/ P! l
// enoughDataFlag=0x00;//0x00还是不行1 p% \) K3 I$ x3 _, x
// }
( g1 w# \( [# m. A6 |; `2 R& R, i! V* Q& [
4 [8 o$ ^3 |" @. C8 g0 t. T
oo=10;
/ k1 S! i: N7 T4 ` oo = oo < 5;0 m& d$ h- [( |
if(oo){) ]9 ^9 G1 `+ T% V6 X; W4 \1 l/ y
ii=0;
( C0 P0 a) Q7 U3 v: {0 ~ }
! M8 L5 F4 ^6 y3 m- r0 h9 z: a if(oo < 5){
* b% X# \4 e: i/ @3 r/ Z ii=0;9 s( W. Z' _6 ^" V5 Q' j
}1 f X# q8 g) l' A- g$ Q; W0 y
if(oo > 5){/ [1 I4 |0 s% B/ o" w! G
ii=0;+ ~& Y' f3 m" a
}9 W! `6 R9 D# C7 k% M
! I) O4 l5 m" t# @5 E, h
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
) v; o2 J4 S9 t( P" ] /* 如果数据足够才执行主程序 */
: r2 C$ }6 W5 U3 f8 ~! Y% b oo = oo < 5;$ n, C* M9 q1 x9 H2 @5 Y' d
enoughDataFlag = enoughDataFlag < 5;
3 T1 W! g1 i$ J) {9 Z. j if (enoughDataFlag < 5) {
8 r1 i; S' Y+ ^7 s// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0) l [% m p# O4 `7 N
AGC_AGC(&pAGC);6 X0 B$ V% u/ ]8 I9 P. V
7 q0 h; Q6 X6 x h {
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
" n9 b0 }0 H; H1 `0 B* U: | FIRDecimator_FIRDecimator(&pRxFilter);
) }) A1 I+ h+ R0 Q* U X1 b; T! N u9 u# a( m" A" d% Z' {! N: K
/* Downsampling */
, I: d# e" \9 p. |/ F: O% J9 O. t c_SymbolSynchronizer_SymbolSync(&pTimingRec);( ]0 {0 w. Y' Y9 k7 m9 p8 s: a; U
( K7 G' T% V8 A2 _
c_PreambleDetector_PreambleDete(&pPrbDet);! H2 B$ j4 l# M8 c, q7 S# {
. T4 ^. q! o# e- h
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
' Y# K" t* h+ f# u /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
B; g2 O4 [; A8 S/ n* d /* %帧数量=100 */
) c; L' m8 q1 O8 S2 G pFrameSync.isInitialized = 0;
& u* O/ J( V0 F/ P J3 Y
$ Z7 w" y3 w0 h/ A, R3 o. W- G/ e /* [EOF] */
% G. f6 c. R; m8 k: g Y: q /* 前导码长度是13 */: x. {0 v2 V, R+ M) b( C9 h0 C
/* %qpsk */
+ G0 Q9 }( F" x) ?" }$ @ pDataDecod.isInitialized = 0;
) v/ i; F( w; S2 }; i$ v
5 _! p: y F+ k( w8 ^0 K /* end */7 o) b2 F. V: H0 r
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
. o; [$ \ w. F /* Convert 3-dB frequency */+ }1 `; M% r6 u' |
/* Convert 3-dB frequency */
1 P0 t; z8 c; ^: q% f. V- `* W filtfilt(save_buffer, usable_left_filtfilt);% z7 Z! X" V3 W& k7 W
for (ixstart = 0; ixstart < 81000; ixstart++) {' ^% m6 n- o- X1 k. r0 D
usable_left_filtfilt[ixstart] *= 2.0;
9 H( x5 A+ C8 T% Y9 ` }' f2 Z5 T8 |: B! v T. h
, v# B: i& }" j# m0 X
/* 注意乘2,处理幅度 */
1 J- P+ Z2 E/ ?) l; k3 E% a /* %% 我发现带通之后其实就均值为0了,不用这一步了 */0 ]" X' }( U; e3 A
/* %% 行列转换 */
6 n( E2 C! h H4 I& B7 X, x+ p yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
6 S6 a7 R _ D for (ixstart = 0; ixstart < 81000; ixstart++) {
e! L: q7 }! n8 e7 Z youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
3 @) t1 }3 \9 j0 R - yiDuanShuJu_mean;
% A$ z* n# C/ [( ^6 } } ~' E: j) y. d) `- K# t* f
: }% z2 V$ {8 U( }# t6 s2 B' C; C
/* %% 应该对数据归一化,但是这一步放在哪比较好 */
8 O2 k5 O- A% o/ j( G/ t! Y ixstart = 1;
8 L+ l4 e8 u8 h$ l* k mtmp = youXiaoShuJu_QuZhiLiu[0];
) v" A. Y2 c j% m" u3 U" f" c4 h8 c if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
) e1 }. P7 c- W* J ix = 2;
1 u* x# S5 s- O( M exitg2 = false;
# a" l+ C6 r3 m4 P2 G while ((!exitg2) && (ix < 81001)) {
/ |, t) U5 a( f! l& h/ u& K ixstart = ix;" A( e+ N) ^5 z$ D: w4 h; s
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {; o, e: S" Z) j$ w' k6 v+ o8 W
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];3 U& g0 R. e2 z# o
exitg2 = true;& P0 l" a0 n- {( T; B2 k
} else {2 T X) y7 h" d
ix++;
9 B+ x/ Z! [* @2 |; F6 L$ |/ h: | }
1 [7 R/ j5 `: O }
" y) ~, y$ ~, J- O) _ }
; X- k1 g+ A' [: k9 A; a8 C' @
- {" N7 t# o" D" M6 ^! a) H& F8 y if (ixstart < 81000) {, k! a6 {4 w0 G- b3 _ S
while (ixstart + 1 < 81001) {
2 R" ^" `$ h3 G( } if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {. T/ j7 h( O4 [. J$ t
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
2 ~3 X% s9 y& Z2 Y* W2 ^. g }7 _7 S U+ g$ z& H& l
/ L; W' y' q: Y$ X
ixstart++;
9 c w9 Y1 r( F) n6 I: A0 P2 _: | }
( s2 O6 ^) v2 }" E }$ W2 g" D# q+ N2 h( h3 E
2 o% h( a/ V5 r) ?+ z+ ^ ixstart = 1;; Y# g; W% ?) C! O9 C8 i1 V$ f
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
& m% S$ h T Z# z. M8 c/ X3 T% b if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {# [3 @1 O U, }2 E% p* ]4 Q8 }, P
ix = 2;3 P4 h$ s" O! ? _
exitg1 = false;
2 }: i4 v! `0 D7 M _. d6 ?7 u* U. c+ l while ((!exitg1) && (ix < 81001)) {0 d9 `1 t3 a' f, d) K
ixstart = ix;
3 d/ H! t. u! S# B- X7 i3 W if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
9 [4 B c+ o V& h+ b yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
3 t6 L# u9 w$ _* {2 Q1 k( R; r, i) | exitg1 = true;" w8 y" ^8 k! x3 x+ i6 Y5 k R+ o
} else {" D, T0 a) a1 n+ q6 N# ^/ s0 [
ix++;( w7 m/ x9 `( \. L/ W* O
}5 Y' i/ z' V7 S9 B4 z9 N, z/ x
}) {8 ^9 H) p% i) m7 A* r- |
}
/ f+ d* D' A' W6 s6 J6 [& g$ n9 h0 i/ q; Y( L
if (ixstart < 81000) {8 e. @, B4 t2 y6 _
while (ixstart + 1 < 81001) {$ ?/ f. T! l4 U( G- ?( K, `2 {2 M* }& F
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
6 i, E% n/ L' A1 z; j yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
' \6 s5 {* z7 I1 p* q0 Y) H }
0 R( j$ v3 L7 n, i# {: b
+ C! z" D L$ q ixstart++;
: r! x9 b- K0 Z/ \5 P) U } Z; a2 z+ s% }! u' c& t
}4 V- a" P& J' C v
6 ]; @# e# p: Z% |: x" D2 w yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);& K. ~$ L/ M5 P# j* R/ q! _( p
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {6 {' y% G$ B8 X5 B c6 P ~! _
yiDuanShuJu_mean = mtmp;
( X( E( f$ ?0 ^+ Y) r3 ?, O }
& j9 F% c# W; C5 t" O+ T) o1 m% M2 s/ X9 ]3 C V
/* 找出极值 */0 f$ s3 F8 g! S- P, `7 e
for (ixstart = 0; ixstart < 81000; ixstart++) {- x. e* K6 }+ ~
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;0 u! u6 W& ~6 n1 B/ G
}
* M1 e# q( j+ _6 d+ l
+ ~; s8 Z5 p9 V& ] --------------帖子字数限制------------------
4 D! P( C7 C( b}4 G. K# f9 C* |9 f! E
; l& r* U# A, `
4 B6 \$ [/ \: S |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|