|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
* t+ ?; X6 G6 Q) {/ {; F" W( ~& f2 K- h S( I% F8 _- ]
各位大神:* L0 ~+ u0 k& L% B0 |
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)& ]4 w! I. E- M) v
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:( b6 i h5 C& B9 e
. n8 i5 C3 `/ S- a0 g# f& u 9 T4 H4 J4 E7 D" H. T
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。6 K0 p8 O; _4 R9 j
4 @- p$ d( U. C4 W1 G8 d5 a并没有其他线程
B3 @5 x! Q V反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
8 m: {& S+ Q' ~% J也说不定是和堆栈有关系。。。。。。
0 C, C- B& f8 t& V7 X1 s+ x' B! l请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数...., l& Z* r$ j6 f8 {9 d/ u$ x
8 ~" S# F. f5 V- ]8 {" X
1 i' x- C8 D4 D3 O" P! O5 S" h. j% t! L8 R' N* I, Y
我也很绝望啊,希望大神能帮帮忙,感激不尽,!
% Z+ \) I- i$ m0 R3 L9 {
4 W, P0 P9 [: v; l& {
% }% h( v0 ?% B+ W附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
' n; V. a) t6 v o4 T0 S& g static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
@4 N; ?' d0 S/ B% T% H) L, Y
/ G8 K. Y6 T( J" h8 _/ R# |boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
6 u9 ]0 `9 A! E( Y+ @# ?/ n4 y! N const double data1000[1000]) {
' G4 N+ u' L, X% Y( h! i8 G1 ]: p" x, O ^7 u! P
int myfuck;7 ]) ^7 o' D% `, N. A
double yiDuanShuJu_mean;
' i: T( E1 s/ C+ i# Q+ @# e8 D double yiDuanShuJu_LowMean[1000];% j0 ^. X3 |% l) `
int ixstart;
& @ _: M0 \. W4 B- y. z. l double dv0[1000];
8 X8 K4 f' u) Z7 E; ?5 D comm_AGC pAGC;0 q+ v- _* X- R( T; x5 K4 ?
comm_CarrierSynchronizer pFineFreqCompensator;4 L1 T4 Z9 k& ]7 D
dspcodegen_FIRDecimator pRxFilter;, X+ t7 @1 ]; F5 l6 F% Z
comm_SymbolSynchronizer pTimingRec;- V7 [ @. |* V
comm_PreambleDetector pPrbDet;
$ V& i# u- u% r3 s. t" W0 G FrameSynchronizer pFrameSync;
1 x2 F4 {2 f7 m* U QPSKDataDecoder pDataDecod;
/ v* d* W) d4 e2 f$ Y, H/ b; { static double usable_left_filtfilt[81000];
) q( H. V$ P& C7 G4 H. V! C static double youXiaoShuJu_QuZhiLiu[81000];
; X! e+ C4 Z5 L5 c4 s2 ^ double mtmp;4 |. `6 q4 ^% S; W, D" \
int ix;1 l, z: @7 a; z0 |4 g3 L
boolean_T exitg2;& F$ U/ Y, w& p: n6 [- _
boolean_T exitg1;
& N- ^& P, p4 c3 X double YiZhenShuJu[800];" ?& {# Q' Z+ n4 C& k) m
double dv1[800];
) S7 `2 W; G4 t- B9 o, i1 l3 Q( j7 j+ g+ C# r* q1 |$ z' X* ?+ _
3 m% b7 ^. h, f, P8 ^/ V7 _2 \
double b_YiZhenShuJu[800]; X' }* R! h/ _% r- L! I( z( l
double I_filtfilt[800];
" k% A7 G; ~$ Y1 z1 k double Q_filtfilt[800];
: }0 w# v. m( n! h. g creal_T b_I_filtfilt[800];
) K% F5 w2 }( }9 C' Y6 l2 u* W+ v/ K creal_T b[800];4 L# Y( W8 K) z+ i* S* n
creal_T RCRxSignal[50];/ {( G# u+ Z. d* g6 P+ l0 B+ r; i J7 V
creal_T fineCompSignal[50];/ ^/ C0 d# ]+ a4 F0 |+ w C
double phError[50];
! j( i4 J: S. A( c" @ creal_T timingRecSignal_data[28];( c9 l$ H; ^9 F$ [+ i: j8 Z2 [
int timingRecSignal_size[1];- q3 |$ F9 h0 E
double prbIdx_data[28];
2 \: g+ F6 |" h! k; i* x int prbIdx_size[1];
: {0 G. e! W1 ?! Q' W double dtMt_data[28];3 ]8 ^; g. F1 {0 K6 n' N+ N1 t
int dtMt_size[1];
5 P+ s) s M4 p# C* T' [ creal_T symFrame[25];
/ b* M3 y$ c4 q( J$ I2 B0 l9 P boolean_T isFrameValid;
# N7 E& o! y6 i+ ^, I double unusedU0[3];* z; s' Y6 z. y T7 M
k6 [% g1 T8 i: y; o- @3 w; P //调试过程中的变量
6 U0 n6 q0 s% V+ \, ~* E! v int enough_data;
: V% `, a1 i- L" b( @
- g) x( J! \% ? j3 C' s int enoughDataFlag;0 n. O" V* n$ g! H; y6 Q
int yiDuanShuJu_mean_int;
# `2 j9 l- Y& J4 a# |- c# W+ _ int int_sum_dv0;4 I$ q, S9 a4 H% G
int oo;
5 e8 C! H5 X2 i7 I. V4 D A+ s1 c7 x int ii;
! R% ^7 M" X" M* s. a6 z& ` myfuck=10;
7 u6 {, i6 p; u. ^+ X% s; H* Q$ G /* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
; U) ], l0 e& u1 k /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */, t7 L" g% X2 V" [
0 ~9 Y3 o& X- a yiDuanShuJu_mean = mean(data1000);
4 ^& C( G; R" l0 x% }
% n' w7 w5 y8 S4 l( W( t9 w yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;$ f, j. |3 _! ~6 R# s5 n
UARTPutc('A');
7 p0 S7 g0 L9 c9 A6 w UARTPutNum(yiDuanShuJu_mean_int);0 x$ Z, H# m5 R X% \" j+ f
UARTPutc('\r');7 ?, N9 z" O% D+ a# K
UARTPutc('\n');9 V9 P k% Y9 c1 v0 ^1 i, i# y
3 V' y- P/ z) i' L/ U U
for (ixstart = 0; ixstart < 1000; ixstart++) {* Q/ d, h; B; X
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;9 ^/ I5 K {: ~# V) A4 C
}# D3 X+ J N1 J. n, w3 `
" n& w$ P3 ~4 n k1 P8 Z
power(yiDuanShuJu_LowMean, dv0);
" S1 Q9 I: t9 v! F- H! Y2 ^3 G3 k3 r
int_sum_dv0 = (int) sum(dv0);
( i5 y: p" _: t# k; D! r, n7 n& N2 j7 k$ a) `: b: P& C$ m0 W" M/ l" j
UARTPutc('B');5 x/ \% A8 V) u8 f
UARTPutNum(int_sum_dv0);
' _8 M2 \- m7 `( ~3 Q UARTPutc('\r');# N( L6 l& R4 f' y/ ?
UARTPutc('\n');0 r$ P5 e% ~$ T( Q/ s5 c$ W- v
8 u7 e( W4 c0 l( W" ^5 I6 d
// int compareFlag = int_sum_dv0 > 1.0E+8;
5 j% z/ X+ f) I$ p: p: _* s, X6 ^5 U6 K9 q
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
! G8 m/ \+ p- x3 @& @ UARTPutc('C');
; h' i+ Q+ y& }0 c' l /* 比较信号能量 */4 w: d5 I- o+ A
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
* V# N( F( m7 |// yiDuanShuJu_mean = 1000.0 * youxiao_k;
& Y0 D/ m$ l: Z4 w4 w6 E# @' d3 ~// for (ixstart = 0; ixstart < 1000; ixstart++) {7 {/ u3 J* ~$ W& c7 I
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
: @. W- K% r# d" o// yiDuanShuJu_LowMean[ixstart];: ?* e/ u3 `& c1 W2 f. ^
// }
& S5 d, }4 Y8 C+ e& x9 H8 M//
! b: [; d& K! O, `9 J8 n8 M// youxiao_k++;
6 I- o5 }( M. d& A; e% S# n4 |+ v// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==6 D7 F% d. j9 Q7 c7 j2 O! s
// /* 感觉要取21个数,即0-20, */
9 q& O5 N$ s! n0 Y- ^9 m// enough_data = 10;//有效是10,无效是0- R% }% Z) C4 B
// }
# c: p) R8 U) g! v+ I }
% p) D; Y* O% |1 u% L2 b0 n5 m% `
* x7 w& i w8 ]3 L0 y4 V/ Z9 @4 E, m3 n# k4 l
enoughDataFlag = 100;; {7 W/ o) U+ ?8 s
enoughDataFlag = 1000;
' ?9 V- P7 Y2 d7 p enoughDataFlag = 0x02;
/ x) _: [0 K2 d, S6 x enoughDataFlag = 200;
! s9 U4 i% d3 V" G* w) J8 D j8 G2 x8 k
' j! ]3 ?' D. Z* S' y* K int myfuvk1;
0 i/ K! N0 b2 D% _) m" G6 ] myfuvk1 =11;( e W0 b, y, M3 [+ p
3 W. a( G8 e% R9 f
) j% i/ s9 Q6 Z9 I) B enough_data = 0;
% A. f8 _4 K3 D. P! X" I
2 u9 J, }% L& a; `// if(enough_data>50){
' E6 T+ I8 g3 e% i: d: k$ `, E, S4 p$ |7 J// enoughDataFlag=0x01;. R4 [! m! M0 z x. B5 [
// }else if(enough_data<50){
1 U$ P' m, ]3 r" S" q& N7 R// enoughDataFlag=0x00;//0x00还是不行. e7 y0 h% Z+ n5 j! E6 p0 H/ c" m# ?
// }& M3 U/ x/ W6 Y( p6 t& D ~/ J# [
3 ~3 _: f0 r3 I* G& ^+ d
# k9 n- ?( H9 n7 I oo=10;. ^+ ~# d' c6 Q
oo = oo < 5;% B/ R/ `1 q$ i8 _" {' L0 ~, T
if(oo){
& e1 X( j" }7 B2 |+ `. l ii=0;
. h* G4 x: G; s( F% I }/ z( ~' B! I9 S6 G i6 x
if(oo < 5){
$ _8 m3 l& |& I; O5 g; Q ii=0;
* z. C8 i* @5 m/ ?. C9 X1 T }" J0 U/ h+ e3 }) e( b# \
if(oo > 5){" w$ [5 D' S# ?
ii=0;
" P. ^4 d& g: A' o! x1 T/ f9 d } R9 \ |+ r" S, e7 a: o' ]
) H1 L6 c( E3 @! j! l /* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
1 @9 i/ [$ k# P& j, Q" X" t3 { /* 如果数据足够才执行主程序 */4 M' V' Z/ i. N$ a% i5 A9 a
oo = oo < 5;
5 C. j. q8 u6 G7 i enoughDataFlag = enoughDataFlag < 5;
: H; H3 n4 F- P& l% D- R9 E. V if (enoughDataFlag < 5) {
" K$ K3 m( R# [- _// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0: N# _1 f7 ], ?( Q; c
AGC_AGC(&pAGC);
0 H( @! s" C2 ^% S& x# w3 a# |1 {8 g V5 s
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);2 w/ U/ E' S- {9 J- H L
FIRDecimator_FIRDecimator(&pRxFilter);
! s' t3 Y3 s; O% b1 B& K) f% y- j' ?! i. Z1 k0 g
/* Downsampling */
; C+ a r5 S6 K7 ` e3 r& B c_SymbolSynchronizer_SymbolSync(&pTimingRec);* r$ G4 Y1 F6 ^4 H4 \! j! ]6 n
8 R! J c) _& U9 O% \% H8 ^ c_PreambleDetector_PreambleDete(&pPrbDet);
9 {3 d& P$ E8 \- e# u( z# W( q$ R- B4 v& D$ E
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */7 ?1 e U8 a% A8 L
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */* D6 n5 b" F& q. t3 M% f8 C0 |
/* %帧数量=100 */
$ C" A1 s8 q8 U pFrameSync.isInitialized = 0;
1 k0 h7 S4 Z0 {8 V5 ]- E5 J: b
/* [EOF] */, o" v7 ^' v x/ U
/* 前导码长度是13 */3 r7 e6 ^- y. Z0 S! D/ ~
/* %qpsk */% d3 e8 d ]* Z" P: \
pDataDecod.isInitialized = 0;
0 o1 p$ w& S) n" N7 `
: l9 Y% U1 y' F$ M$ u7 D /* end */! E, z# m! F( p
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */3 |1 G- a5 n" f3 [6 y3 ]) e1 S y. M
/* Convert 3-dB frequency */+ E& R# F4 n+ y; E9 D5 B7 B; y
/* Convert 3-dB frequency */! k- U) ]* G5 Z! z% u
filtfilt(save_buffer, usable_left_filtfilt);
, `- f, b: ~& _( q9 Q1 @' t for (ixstart = 0; ixstart < 81000; ixstart++) {
( r' N: z. e/ c& Z" n usable_left_filtfilt[ixstart] *= 2.0;
e3 t$ P* u- [' t8 T( Z' I }
: X& N4 ~4 R0 z! r# h) _& p7 R% y& T7 g: f. s- Y6 H. C: j/ E5 x
/* 注意乘2,处理幅度 */) t% s5 a9 A* {( Q
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */. o8 n' U" A) |" f! ?3 Q6 A5 n! w
/* %% 行列转换 */+ s0 b' D) B+ O. ~5 R
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);4 o; F F' a0 u# n; K) P9 z
for (ixstart = 0; ixstart < 81000; ixstart++) {
* T' _* \4 H. R8 j# Q8 H youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]! e. X3 U" d; m% W3 W9 V% N. ]
- yiDuanShuJu_mean;# ]5 R' B7 l6 C; v9 w
}6 l2 l0 r+ j7 j8 N/ ?
" v; M# C, {$ d /* %% 应该对数据归一化,但是这一步放在哪比较好 */& Q, s6 C2 M; |* w. [+ Y q
ixstart = 1;7 y0 P& O: t& ~" ^- I2 T
mtmp = youXiaoShuJu_QuZhiLiu[0];
9 u7 B/ Z# m. d& v0 v5 a if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {# t" ]/ J O+ m# G6 G
ix = 2;
2 r( C: r! X/ _2 i" [0 v& |% O exitg2 = false;
! Z& k X9 P6 h( N while ((!exitg2) && (ix < 81001)) {
# E/ [/ Z5 p% N! \3 q# s+ E- O% t' A ixstart = ix;4 }2 \1 Y1 [/ s
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {6 J7 P8 W' [- L8 v) g9 ?& |
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
0 \' @: T: _+ M9 w exitg2 = true;
% Y* W, h0 F/ a& k, x2 P1 l& @0 F } else {0 s# \3 ~3 {# n" h: B# e: r8 ~
ix++;
9 g: u1 A/ W, o/ V! s }
& j0 d' A& i3 | }: U2 W& @8 E1 C, `; ~
}
, H* l3 C7 i5 [: g0 @/ d9 f
3 w& L% k+ J1 ^ if (ixstart < 81000) {
) i" _* V' T; y while (ixstart + 1 < 81001) {
. U4 s" J. Z7 H) o! M if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
5 v9 B! I0 I" x- }- { mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
8 z! l/ c4 W) ?' E% ?% k. w }
# y# ^! X9 e4 ?) u ~' j, o' ^3 a* S T/ T
ixstart++;6 W: m7 X: V# j* _ Q6 R7 Y) [
}
* K/ W: l; Y; r1 f } Y4 d8 N% I/ p0 V, T
( o- u. ^4 S" h
ixstart = 1;1 i: O7 i; E. d
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
2 l# s, d" M+ w7 ^5 ], ^$ U/ a if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
( ]9 e3 |# T% Z; F4 t ix = 2;6 a: b# ~- f) d4 \. ]
exitg1 = false;
' B4 d: u. B' W: r1 s while ((!exitg1) && (ix < 81001)) {
* s3 g* a" m8 j" p& | ixstart = ix;$ l& c4 n) S) J7 ]) b4 ?; k: z+ v
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {9 ^, G; L: Y$ B8 x5 H
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
& F" E1 a8 [2 W+ S exitg1 = true;" f9 d1 o7 ~3 y$ f
} else {' F8 t( y1 D4 p
ix++;/ Q; A8 s3 K+ R2 p6 r5 O+ v
}; B& @+ ~$ a8 p# k; B- Z; @
}
* L9 M/ W4 K( I, W* r$ j }
4 {6 P; d0 F/ X7 H6 a3 j
# a9 x1 Y% z e# p& M' {$ y if (ixstart < 81000) {$ K# Q1 T! [( D% B% _% V, |
while (ixstart + 1 < 81001) {
4 ~2 \) ?+ n+ E7 ?) i& d8 A6 A+ ^" | if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {& @- a( }: ?; b$ i: K9 a
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];0 @6 G$ V, { e3 n& g
}
$ X! u% Y6 V) D+ L
% s; h3 `7 p6 V$ N! S6 g+ p* w ixstart++;
* X8 \3 ]% r# ` }
7 g! {$ ]" _" j" L }
6 c" r4 ]& G" \! f5 g0 d2 o2 f
8 p& k) c( ]" S2 a yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);5 J5 h! B- c& l8 L* G. N
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) { ^$ _% O1 k7 W% o1 O
yiDuanShuJu_mean = mtmp;
0 d: @' X( u- }3 b$ w" r' N2 G }
: w6 c$ s; G R: o$ t% p& i7 ^+ Z5 r4 C* ]
/* 找出极值 */$ p4 d5 k5 e+ h5 K$ {$ @4 R) R4 I' }
for (ixstart = 0; ixstart < 81000; ixstart++) {% X! C' A& j4 C! B+ t/ u( X) J
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;( I$ W/ x' ~* J# H* U3 a; Z1 L3 P
}/ X( h4 W, z) R' I( c
2 A: H* Q& i" F --------------帖子字数限制------------------
9 ]+ D0 Q! p1 L4 V3 s, P+ `}
0 p0 h9 T X; ^ s4 B7 I+ v2 h9 `$ X
?0 h" I: [ z0 f( b |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|