|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
: l+ Z9 @$ X4 R; I# b
4 F9 m8 ], b+ k3 A8 u5 ]各位大神:
" }, J- x/ f& m. h% {9 d/ p 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
. z2 G2 N4 u, s! V" u |4 I3 ~) C 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:, ]3 u; v1 j3 M4 x
! {( } R/ H4 f8 ]2 s# Y2 S* t ( E+ c! m/ Z6 b4 U
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。' N: Q3 v, ~- T* J* d
7 I1 k6 B( |1 d! {
并没有其他线程
# g3 d4 H. R+ E2 \# V* q反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。) ~- S( [+ O/ j4 N
也说不定是和堆栈有关系。。。。。。
0 Q7 f2 T0 I3 [( D3 h% P请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....6 c- b% Y. }$ u- F9 o6 Q; @5 Q3 L- Q& B
3 s4 F# K: l2 {/ r4 f6 c" z: Y4 ?
6 Q- K8 h" ~+ _4 G3 C我也很绝望啊,希望大神能帮帮忙,感激不尽,!
6 z e( [5 e9 r8 b: Z
; v* V. Y- ]1 q0 e h; L9 O8 @! ]& |9 o( ]4 O
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];6 F" [' @$ v2 C- x; [2 s* g, t0 L9 M
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
5 c4 B1 Y# t5 Z ], b6 z* ]4 e8 M
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
5 J& u' I2 x! q' t. M const double data1000[1000]) {% e% H$ d. @. ^2 h) j% `3 n0 r! ?" v6 _
8 G* e7 o1 |/ x& `5 q* r5 U
int myfuck;
" `! v" R G' R! } double yiDuanShuJu_mean;
2 _/ a0 |2 h) g5 }5 E) }- P3 z" n double yiDuanShuJu_LowMean[1000];
7 V: q. x% B& v& E9 y' @' x int ixstart;0 U: X; s! w5 _# L
double dv0[1000];# q4 o) e) ]8 h5 T9 z
comm_AGC pAGC;
* N+ T# z9 |* g3 a" `/ g comm_CarrierSynchronizer pFineFreqCompensator;; H, W7 [4 P, @- Y; s- B j; G
dspcodegen_FIRDecimator pRxFilter;
6 [4 F; B! v0 q# x' Y! y comm_SymbolSynchronizer pTimingRec;+ D, J( ~- w7 x5 e! i; q5 ^
comm_PreambleDetector pPrbDet;/ c2 P* R6 j3 F6 X
FrameSynchronizer pFrameSync;8 U/ b ?. S6 O+ ?& J8 H8 W
QPSKDataDecoder pDataDecod;1 }6 J# k& e" {; ?. d% y
static double usable_left_filtfilt[81000];3 x4 y' w) P4 x6 B
static double youXiaoShuJu_QuZhiLiu[81000];" r* f! r( U2 _' h; [9 o7 s
double mtmp;% Y& J2 l5 b. z+ h- ] F) ~
int ix;
: t2 d, E1 m4 a ?8 W% W* X boolean_T exitg2;
& V$ E7 z+ b% S' J1 T boolean_T exitg1;- C" j5 J5 Q, |) f$ I" }. E
double YiZhenShuJu[800];
& |. ?$ Q5 h7 D# x double dv1[800];
/ d3 Q" [+ j( i X
# R" W' Q0 o8 @: @1 X# z1 j( m+ `7 D+ k+ @1 b0 u, J
double b_YiZhenShuJu[800];
! I, Y6 d4 Y S9 \3 n0 g double I_filtfilt[800];
, h$ S; o5 } g2 u. \# D, [7 x double Q_filtfilt[800];
% k* G. \: h$ R* @5 A creal_T b_I_filtfilt[800];
1 L8 f3 P1 ?* k1 F creal_T b[800]; t% w" Z. x2 g' U: r1 H
creal_T RCRxSignal[50];
# H$ }/ S" \5 N7 J8 Q0 A creal_T fineCompSignal[50];" N. I: M/ i4 p' s: D
double phError[50];. I/ @/ R% O+ x& B, [
creal_T timingRecSignal_data[28];& w+ v" [ r( R
int timingRecSignal_size[1];, G$ Y2 o, h% D, s! ]5 ?
double prbIdx_data[28];
& F* j% S9 J1 `% e) A6 L int prbIdx_size[1];' U; ^0 S: i. }7 H$ C
double dtMt_data[28];2 b6 x& I! f# v( j
int dtMt_size[1];/ w5 A7 [! w1 @
creal_T symFrame[25];
. m8 { k! q2 B6 f boolean_T isFrameValid;$ F& P3 ~% w: e1 |
double unusedU0[3];
7 }1 s( j1 `/ Y, |6 l6 f. Y: L. ]# w0 [, `
//调试过程中的变量' D' j* m0 D5 O
int enough_data;& d8 C% I5 [4 j0 V: J0 H( O
" g: }" g7 i1 u, a. F( Z% w# \ int enoughDataFlag;* i; }% K3 J7 g4 n- c& N: S0 x. ^
int yiDuanShuJu_mean_int;1 }- {% L8 I5 e8 \0 j% p, W9 j
int int_sum_dv0;
* p9 j. e- i, i1 n4 P' R int oo;' V6 k* L k6 f, H
int ii;7 Z% o+ t# p `4 b
myfuck=10;. d6 \$ I6 U8 y- k4 k6 U' V6 H7 n
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */0 B) s* B+ t- D/ Z
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
! D( Q( S% _- U. s2 K. {
1 ]* r7 G% H' M yiDuanShuJu_mean = mean(data1000);
# F! D) [3 H$ o) }
! H$ [, Z2 E% [1 Y, y5 j yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;8 ]" F0 V. ^/ L# P2 }
UARTPutc('A');5 t( U4 y4 j5 F% m# \
UARTPutNum(yiDuanShuJu_mean_int);
' h! u. X, o, v9 u6 f UARTPutc('\r');( [$ P! K5 X% h3 G |: R
UARTPutc('\n');* }9 r3 f3 B5 Z4 U) h H
7 E* ?$ K$ q3 s6 ~: H0 C5 _# N for (ixstart = 0; ixstart < 1000; ixstart++) {
7 m3 v6 ]( [ K# s yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
% q* Z2 T6 m# x0 O1 F9 L }9 g/ X# }5 W ~3 e
* n* \0 }0 ?2 R, {$ s' r power(yiDuanShuJu_LowMean, dv0);, {8 b0 |+ m% V) S" p ]
7 G; e; V4 ^8 W. R9 s" i
int_sum_dv0 = (int) sum(dv0);- S5 o" d4 r& L, a
& |$ S8 \& L: T5 {0 i- M
UARTPutc('B');
# E+ ~: t! r" t* f+ E6 a UARTPutNum(int_sum_dv0);
7 n# [4 G. V8 s4 E1 f& L, t3 s UARTPutc('\r');4 G, s U, J- A
UARTPutc('\n');6 H$ {" Q3 n) }: ^( M
$ K0 \! f: q4 Z) V7 v// int compareFlag = int_sum_dv0 > 1.0E+8;
; N1 c6 m6 h6 l" F
2 h! M; n( |% O( j$ N7 S! W if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
6 g+ E. M# r# S' ` o UARTPutc('C');2 n' ^8 o8 y1 K& A2 I8 T2 b* v! f
/* 比较信号能量 */
0 r! q* e9 o6 r: {6 N! ^ /* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */" n' O- s" I+ O$ L3 h `2 F+ ^
// yiDuanShuJu_mean = 1000.0 * youxiao_k;- x m3 H' `5 a' z0 V F1 f
// for (ixstart = 0; ixstart < 1000; ixstart++) {. C& w. z4 e4 c
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
+ w5 I$ _0 Z* R// yiDuanShuJu_LowMean[ixstart];0 W5 b- ]/ y9 m o4 v' m; n
// }& U0 n5 r- W, _2 `5 T
//
- g- E; \% X8 u1 t// youxiao_k++;
% R# f* g! T! C3 f/ z/ a# {// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
9 O! q0 r& D, I W3 g// /* 感觉要取21个数,即0-20, */" T+ ~* @9 P, O: Y5 K% y6 r0 ~/ _7 K" J
// enough_data = 10;//有效是10,无效是0. L8 E+ J$ l8 {2 p5 _2 T% X
// }. k0 Z# q+ K4 k
}
8 @' X. C2 _, ~# v% y3 ^2 N
( D& V3 z' C0 Y% t) l
. ], ?- q) k' X( _" L1 W& h enoughDataFlag = 100;! {" Y# ]$ C- f4 n5 W; i& X
enoughDataFlag = 1000;
) ^8 D2 [& f, d9 Q5 S enoughDataFlag = 0x02;
, f8 o4 o+ W" h+ {6 W# k enoughDataFlag = 200;- G r8 \* N7 Z2 K3 K9 [' @
A* \+ I6 ?9 y% o
int myfuvk1;" n; z! E- V+ I9 ^6 ?! J
myfuvk1 =11;$ M& m0 V M# }$ J7 n
, G0 d7 D0 H$ o0 P$ }# m; l
- }- g3 G5 h# H9 X2 G; t) `( u
enough_data = 0;
& t7 O+ t) y) V6 M/ u! v. j5 Q2 q; @4 ?/ x x o
// if(enough_data>50){
! ~7 {4 z: n( \// enoughDataFlag=0x01;! M9 p& J6 v7 c' y" h
// }else if(enough_data<50){% Y2 h) {& u. l; @" z. i, T: @- ^
// enoughDataFlag=0x00;//0x00还是不行8 G q% [; z+ l4 h& `
// }
2 ~' Z7 R, I. |0 E1 @5 ]/ ?$ n; M# r1 U: a
) z3 P" f; d U% N$ ` oo=10;- \% c) u* S& _+ N
oo = oo < 5;
6 Y9 t: {% U J4 k1 S- A if(oo){9 c; @7 W8 e, c1 m
ii=0;9 G6 t X& w6 a+ ~6 z. U
}
+ y; y, d( S% H if(oo < 5){
: n/ C" y& e3 a9 X! Q& E, c# m5 U ii=0; q, s' }' O. D% }, v7 T
}9 A/ ~- j1 Z, p% {
if(oo > 5){
8 g- c/ q/ _9 c ii=0;
: f" P$ S6 i- K, A. p' W+ W }
% s# d4 C2 j# T9 x; L5 }0 w0 Y
) S0 k5 D* r+ A8 q7 p /* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
$ d7 \5 o! ]& T4 } /* 如果数据足够才执行主程序 */1 h5 N/ m/ _8 T9 l
oo = oo < 5;4 a3 {1 E, L' A
enoughDataFlag = enoughDataFlag < 5;
5 P7 W3 k# s. S if (enoughDataFlag < 5) {
4 a5 y9 l" ?! ^3 R" m// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是00 S' v) m7 l& z( z: G
AGC_AGC(&pAGC);2 I. G+ c! f4 _9 g u. _7 l
% j- }0 G% H4 V2 q2 F( E c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
5 I$ q: W8 x" D- k+ _( U FIRDecimator_FIRDecimator(&pRxFilter);
[8 _( C7 G% j: w9 g. o, a1 r7 j6 G5 m) V ^
/* Downsampling */
5 D5 B( `* V+ U; |" h% W. u, I c_SymbolSynchronizer_SymbolSync(&pTimingRec);
& o! J ^; J, w+ c2 D+ c4 d8 _: T' Z0 C( F1 g; n
c_PreambleDetector_PreambleDete(&pPrbDet);: K# K9 f3 K" z1 C% `2 `
8 @: E7 M8 t$ `, V) v
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
' ^& G" H6 l- S8 s& ] V/ D /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
# n: D5 ]/ N% S& g6 e9 Y /* %帧数量=100 */" F& i7 X/ I0 u; r% t
pFrameSync.isInitialized = 0;
! O: @! f q7 |6 {
% N' [$ D. {* T- C1 Z /* [EOF] */
8 }' G4 m( }$ i5 ]+ r7 l9 R3 Q" {% e /* 前导码长度是13 */
. { ?& D3 b, |- ? /* %qpsk */
( {$ p$ [, S0 x) S" H pDataDecod.isInitialized = 0;9 T$ _, {% I8 V N
! ~3 F4 h) j# C/ X S3 f% g
/* end */# o! P6 @( x. P9 u7 ~8 \/ u
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
& Z% k, t* Y! T /* Convert 3-dB frequency */& R3 `- w2 K9 I2 \' [& R/ j
/* Convert 3-dB frequency */, F L* c0 |& b! e0 w+ ?$ s5 E
filtfilt(save_buffer, usable_left_filtfilt);' t6 P3 \& B! P, X1 `
for (ixstart = 0; ixstart < 81000; ixstart++) {
3 J4 P7 P8 L/ {8 h7 P* Q usable_left_filtfilt[ixstart] *= 2.0;' W% J1 Z+ y @5 r; m- O! W. c+ P
}
+ L1 f5 z2 o9 m2 V- z9 |7 Z3 E- o" o3 W3 b4 ^( A3 \# E9 D
/* 注意乘2,处理幅度 */. c* d* x) q3 E2 B/ T
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */
( L% M% A' B3 g. @ /* %% 行列转换 *// g4 T8 \" f4 F% k8 U3 m+ Z9 l# f
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);9 k+ O0 W! ?. q8 e1 K4 L. q
for (ixstart = 0; ixstart < 81000; ixstart++) {% @0 D3 K; |$ J& [, l" a$ z) R- w
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]! E- u. j: b( s* B i: ?" I
- yiDuanShuJu_mean;5 S, X# n$ f% u( k
}
4 d. l! c. b, L! e# u& W0 W$ L4 ], O1 L k
/* %% 应该对数据归一化,但是这一步放在哪比较好 */1 q0 d3 W3 K* s( Q% N; m& V
ixstart = 1;
+ v4 j( N9 _2 y mtmp = youXiaoShuJu_QuZhiLiu[0];% m" q* c" T) ^; i
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {+ M+ a- q( S4 s( R$ W
ix = 2;
& S7 u$ ]6 o7 K* o) } exitg2 = false;
3 o4 h& C) H6 _* q$ G6 H; q while ((!exitg2) && (ix < 81001)) {" {6 c, S3 e8 n. z
ixstart = ix;# |; s( p" W' ?. X% K5 Z: d' x
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
# k! W' W" f8 H mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];* R: ~6 _4 e6 |8 B% L0 z5 }
exitg2 = true;
6 @( W, J# R( S' d3 W } else {
- m6 h r7 `( ^% O U/ r+ ~ ix++;
( x) Z7 ^- Z0 T; m }1 E: X: m3 C: w8 g* q7 d. I
}; T; i Z7 M5 p. E# e' [
}% l, B( A7 d/ r4 r5 m
' k6 v! E7 n7 k- @3 f4 t
if (ixstart < 81000) {) o3 Y% c) t) O2 A& j- \0 i
while (ixstart + 1 < 81001) {5 M& S. O, o1 x6 f& G ~
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {# ~9 j: e/ m5 a3 r/ M& c% k1 t
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];0 x7 g- [* J! \$ R a0 y8 ^: @) v
}
$ U* d3 m3 Y" C' \
$ ?$ p% |2 h- j3 A2 V ixstart++;
5 q* _) ]4 {& n& @/ U }. n9 c# z4 Y* r" {5 a
}& Y% A f$ j# `/ j
: J& T: X1 `' p( z0 K" f) J
ixstart = 1;0 w/ O. X( L6 X
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];2 E6 B! K. i( } g8 L. u
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
* n5 X. v, j6 A; P1 y6 H+ h ix = 2;
9 V! G2 M/ n, H4 K8 q0 t exitg1 = false;
2 D/ s$ H9 }# q while ((!exitg1) && (ix < 81001)) {# q! S# {& z- O3 q1 X% R, p" _
ixstart = ix;- h$ U Z; ~9 X9 o4 R, _% p
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
9 ^) P9 Q$ l. T3 h, B8 w yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];* q. q4 V! q8 G; P- w
exitg1 = true;9 ` K1 J1 r. u4 W$ A. m
} else {
, V* X' F( y/ b+ J# D, X' A4 Y ix++;3 n5 D3 v3 n' h) F1 m' O
}
' i! K; v$ ^* S% f n }
5 Z( x4 W8 |$ O. Z" y } x9 K5 M* Y% G% V6 U
g2 N0 m- G; [, @2 [: ` if (ixstart < 81000) {
* \5 I* D' N; O+ \ ^ while (ixstart + 1 < 81001) {
, b \# Q0 Z8 F# k if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
E/ }1 @' e' k: x% M yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];2 Y4 Q" H7 |' i w6 l. |( z
}
+ Q6 V/ T/ L7 ?$ T
% l- o q E5 G& S ixstart++;
& ]; `1 M" _- A d9 V2 j: P% ?& k& F }% t/ F* v( l R; O8 V% E1 B2 N. }
}" _# [8 k8 {8 h
+ s* I. b9 q/ {1 W: r5 a yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
3 z ], f7 d _+ K if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {5 g: q6 y8 j% V, Z2 D* h/ C/ [! y4 M
yiDuanShuJu_mean = mtmp;
' h: ~% D/ \6 d1 n$ L }4 G) s& h6 P8 [# p6 c
0 C' @5 w2 A% d% B /* 找出极值 */3 X* z: Z( l5 Z! d3 N& ~& a) ~
for (ixstart = 0; ixstart < 81000; ixstart++) {# D1 g" D3 e! q+ c7 O, B, r2 t7 k7 k
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
4 X# L, [3 J- E4 a3 N8 r }
, |1 J8 ?, [0 G3 Q9 j- l/ w. g' a5 J8 _/ H
--------------帖子字数限制------------------
3 v* L. v8 n. l2 s, w}" R+ X4 ]4 n/ O( X; j
/ z& W4 F8 }0 K7 @ w3 c
2 W i/ D, J1 K |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|