|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
% J* ]& f7 U ]& Q) f8 r3 o8 }7 A$ B) G! S& @& q
各位大神:0 V. [ z$ i5 v- N
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~); _/ x' o; A. s! p9 f1 m2 s [* {6 s: ~
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:1 D$ p8 R' q/ @
* Q" `1 K2 e* W7 h2 [ c6 w" D
4 r" P$ I( t, s. D这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
0 H* h- W6 K* w( L% r1 r% q
3 D4 Z2 K5 A; u5 ?. w并没有其他线程
" {- Y2 A! J9 i5 K$ F$ m反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
" q! F7 O: Q5 f$ {; H1 K7 h5 @5 `也说不定是和堆栈有关系。。。。。。
' f' \8 c8 J3 Y1 j* O0 }! ?请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....4 e- k# a4 I. i/ L0 g
) w6 ?8 e/ z! g) t
4 {! b& E0 g, s+ \
+ o0 o+ i! ?) v9 n& J& j
我也很绝望啊,希望大神能帮帮忙,感激不尽,!8 D Q( [6 y+ j' V) V2 h' x+ ^# v, x
0 d! o3 L; ~: |$ v' t" }7 M2 v8 [1 Z5 ~7 {
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];7 {2 N+ N3 q7 W
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。1 o7 g3 x6 ?5 b! C! m. N: Y& A
- T# t( I; I2 a
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(' P7 O3 q% [+ _& x4 p7 K
const double data1000[1000]) {0 |+ y+ T- M- V b8 T$ X8 N; B
# p+ a8 n1 K) C8 P; d4 k/ L int myfuck;4 R- g) K/ ~1 @ y- \2 W2 r+ K
double yiDuanShuJu_mean; z9 X9 Y2 ?- b8 r& G( _+ q
double yiDuanShuJu_LowMean[1000];
3 c3 b7 R2 w/ X- O$ X$ { int ixstart;* E* n7 Q. C$ Y( x- G' M2 Q% e
double dv0[1000];& x8 V2 u2 H* `2 d" s# n
comm_AGC pAGC;
$ h( {% M( y1 i- W$ s0 }; z' p' c comm_CarrierSynchronizer pFineFreqCompensator;
- e" _" w7 [4 c c* A dspcodegen_FIRDecimator pRxFilter;
x* \9 Y- T6 |2 v comm_SymbolSynchronizer pTimingRec;, t7 u: K: U/ L) X9 t( H4 S
comm_PreambleDetector pPrbDet;
. C2 p; ?' ^+ U FrameSynchronizer pFrameSync;
: D, ]& U8 {7 C2 d9 L QPSKDataDecoder pDataDecod;
# y/ K. m* e9 J) t static double usable_left_filtfilt[81000];
2 f3 M1 h& W B+ K0 O+ F2 R# N static double youXiaoShuJu_QuZhiLiu[81000];
! C4 P5 E$ T1 i: i7 U double mtmp;' w4 z9 Z) l9 k6 M2 A
int ix;
7 g4 ^& y7 k) q: m1 n5 a boolean_T exitg2;; n ], b$ Q M/ G6 U- Y
boolean_T exitg1;
, x, o9 n& I! a4 V) f+ U double YiZhenShuJu[800];& h W ~6 ]4 I5 ^( t( B
double dv1[800];2 o+ J/ B/ P9 }
! e5 ~# H( G2 E* ^7 B
+ D% F- E' d/ B) Z double b_YiZhenShuJu[800];! K% `7 y/ t: H6 `& T, K C* }& e
double I_filtfilt[800];, x8 {) X7 G: c4 a, K2 s3 P
double Q_filtfilt[800];3 D T+ i/ r5 z) W6 ^
creal_T b_I_filtfilt[800];8 g& ]0 s% n1 g/ a6 x
creal_T b[800];8 G7 |8 g- D2 y1 [
creal_T RCRxSignal[50];
: O( r9 h8 @& M; J creal_T fineCompSignal[50];
4 |0 T7 h; A' f double phError[50];& {6 k* ~6 d# @1 z& L; _# k
creal_T timingRecSignal_data[28];
0 m* t' M# O. f2 D" L; b: L5 l int timingRecSignal_size[1];* k7 t' K. v/ @8 ?' ^
double prbIdx_data[28];
' ~/ T7 }3 Q3 ]: _/ Q/ J* l$ { int prbIdx_size[1];$ R! p$ u* s( W6 q% Q
double dtMt_data[28];
! h6 a) P6 ?+ ]2 r int dtMt_size[1];
' a7 t( c2 M- ^6 b: H8 R4 D creal_T symFrame[25];
" i/ f! p) ?) R: ` [ boolean_T isFrameValid;
) Q2 D/ H) p, @! n3 {: i double unusedU0[3];
3 M1 Z5 [( m/ s6 r2 T" N" L# V' B$ R" j3 ]3 T% `% H& S( H
//调试过程中的变量' G' n9 ^/ @3 P; o5 L2 d) e
int enough_data;
8 {1 k' j- R; h" N7 [; g% E; ^6 U# K
int enoughDataFlag;
" m* N7 Y( B9 I) L0 J& e7 I( S int yiDuanShuJu_mean_int;5 R( s) I7 @$ O- l
int int_sum_dv0;
2 D5 W# b( }& }# d r/ T9 D# @4 P int oo;- E R# s! n2 X) `6 X6 {9 y
int ii;
3 J- f' T7 M5 _' X! t& W; ~ myfuck=10;
0 ^ a$ p' G4 ]: s1 E /* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
+ X. R$ G7 D; B$ b) }0 A /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
E5 Z0 V: ?- j
0 v' J% N- b1 e% O3 i i& G! G yiDuanShuJu_mean = mean(data1000);. T( x/ @5 F. M4 D
' v! Q" y6 N w
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;6 m$ x0 i: f, F, {' M
UARTPutc('A');; X8 Q3 D6 A+ S5 @; y
UARTPutNum(yiDuanShuJu_mean_int);1 V5 ]2 s; d! T- ^! m
UARTPutc('\r');
3 j* Y* N$ [: ` UARTPutc('\n');
, U M& j3 h* M+ I5 P) S+ H1 m" [1 d5 R% N+ o$ h k! G/ d: T
for (ixstart = 0; ixstart < 1000; ixstart++) {% `; x& S3 h& B0 B
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;1 N; N! a. B- S+ t% {- N
}# e% t& B' G! K! l* O* o
( |. w+ R' q* h" @7 T* F( ^4 b power(yiDuanShuJu_LowMean, dv0);
. ]8 E ^" N) L' b+ _' [ g" v6 j w) m4 q! }8 Z# _' M
int_sum_dv0 = (int) sum(dv0);
# X5 l$ p1 `& W. V. g% _/ c8 ?7 p& p" f3 ]) T# F
UARTPutc('B');# a9 M8 @7 g1 N
UARTPutNum(int_sum_dv0);
' m \$ l* P1 z3 n/ o' r! X UARTPutc('\r');
6 W1 d" i, i0 U/ n& ~$ i UARTPutc('\n');& F7 `* p6 P7 y
' T1 v% L3 V2 C- n m
// int compareFlag = int_sum_dv0 > 1.0E+8;
7 z1 E7 L7 n, a, U. b& l1 B; z/ O% g2 A
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
( N3 P# i) S0 t; o$ T, O UARTPutc('C');- \6 b3 c' f* |2 ]+ @
/* 比较信号能量 */
( s! Y6 _8 P/ G8 M /* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
6 u9 `) _, I+ O6 |/ v7 T# s7 ~// yiDuanShuJu_mean = 1000.0 * youxiao_k;4 n" @) v" B6 o' p: x
// for (ixstart = 0; ixstart < 1000; ixstart++) {: Q: v$ ?. B# m. ?5 D* F" k5 o
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =6 g2 v8 w, U' s3 z1 M
// yiDuanShuJu_LowMean[ixstart];
7 }9 d; T& P! | G4 p% T// }
9 ]2 ^/ L! }, o//4 h/ _* S5 M6 V
// youxiao_k++;' G% d& N9 y7 k/ a
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==# V: q0 B9 V2 f6 @
// /* 感觉要取21个数,即0-20, */
$ e, o0 m" x. K1 R+ ?9 _; z// enough_data = 10;//有效是10,无效是0, F; A' \( J: U) e
// }
- R) V2 T) L. k5 | }4 K8 g9 g* n. B; D& j; B! D
1 F( s7 y# Z; x7 u3 p7 s* E
( O/ B* @% ~# l enoughDataFlag = 100;5 X" c0 f2 [/ r2 h j; y, R
enoughDataFlag = 1000;
& ^- [) h, ^" [7 B" A9 {2 l enoughDataFlag = 0x02;' @% I E$ R; |9 w6 c" Z1 s
enoughDataFlag = 200;: c" S% }6 P: r. g! M. X
1 N8 Z6 i m- E$ U int myfuvk1;
+ s8 P5 } |7 F myfuvk1 =11;# Z g/ P# b4 b* P0 I+ P
e! x7 q q) X) r8 v
6 }7 r0 s* Z) I" y5 n
enough_data = 0;
7 X% K: \* ^) X& ^, T0 u
; S4 _) U, {" |# b* w// if(enough_data>50){
+ l" o; i u4 n4 S4 C# e- K// enoughDataFlag=0x01;7 h) R% m6 w6 C. g6 L# G9 t
// }else if(enough_data<50){5 \( u* g2 A- L( q7 A
// enoughDataFlag=0x00;//0x00还是不行
4 v) q: w6 G1 S! v// }
9 g# k9 o, ^0 l8 y" s; {
/ A+ d: c0 u! H! j, b/ Y9 r) g& o+ c2 ] p x( \ f5 f. d
oo=10;$ V9 w* v5 r8 V2 R0 ? ^' E# K3 D* k
oo = oo < 5;$ u" W" \6 H5 g9 q) r' K7 s
if(oo){
7 E& T2 B& C) {- d5 l$ g8 W, D3 { ii=0;& {+ r6 Z. Q% L% o+ K
}4 Z7 s- v- s2 F, s
if(oo < 5){0 s( h; g& ~1 V3 t2 i. t" Z- i
ii=0;
* g/ [% p6 u$ e( @ }
4 z* t! w- c. v/ W$ C ~ if(oo > 5){
3 `, C0 W9 Y5 t. F8 N7 ?- I' _) b ii=0;
( e1 s |0 ]5 z" E4 h }, f* M( L R# r* K! C
. p1 ]$ \0 ]0 n( V: V6 K& F( H /* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
; z3 I# g; d8 w9 G /* 如果数据足够才执行主程序 */
! C$ o4 W$ ?! ^6 V! E3 _ oo = oo < 5;
5 ^; e7 W9 K( G- L; n- ]" f enoughDataFlag = enoughDataFlag < 5;+ H$ |7 h0 C" w
if (enoughDataFlag < 5) {
& c3 c! n) `" O) D8 r* S// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
. u4 d7 Y# i) W AGC_AGC(&pAGC);$ T4 M% P' S- s/ M0 S3 q
% M& N0 i3 j7 V3 {) p2 E7 D
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);0 H- X$ |( y3 L: }; D1 q# J: h
FIRDecimator_FIRDecimator(&pRxFilter);
7 C$ w0 L! I! A% M# _ ]! P |. c" G$ ], Y0 V9 G
/* Downsampling */# R3 G) r' V- G& E. B: ^" Q: t
c_SymbolSynchronizer_SymbolSync(&pTimingRec);# r' D# k; q( N: Y" L# `
, s# @0 W) f( J3 T* X5 A
c_PreambleDetector_PreambleDete(&pPrbDet);0 M6 |2 O" S% X2 N. R8 [6 ]3 ]
/ ?2 H# \0 A' S. \* [) r /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
# O9 O: S& e" ?; U% _. ~/ w U /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */8 J) u3 d- g+ d4 |
/* %帧数量=100 */* V% W% ? k7 a1 U6 r' P0 k
pFrameSync.isInitialized = 0;
( O& a- O) c8 i. k+ K* @( K* M( s
- \% ~$ l6 A3 _& X' L9 f3 O /* [EOF] */# L/ `9 x; e$ F2 f; p: \3 k! j
/* 前导码长度是13 */
5 f; c. J. }' m- R /* %qpsk */
6 u! V% v1 H1 P* l; D pDataDecod.isInitialized = 0; D& m& u9 b8 P5 ~* U6 r# u
) A0 N" a, {* f4 d# N. P. _
/* end */
( [ F# F& ^) ]/ d /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
8 {: e1 ~) P2 S( q( |) n /* Convert 3-dB frequency */
6 b+ X# ?, g5 d3 h /* Convert 3-dB frequency */
Z9 W0 U. I* T- m0 \. v filtfilt(save_buffer, usable_left_filtfilt);
4 e' q" s& u9 n0 I for (ixstart = 0; ixstart < 81000; ixstart++) {
5 L5 r( t, E9 V2 ^1 S usable_left_filtfilt[ixstart] *= 2.0;' ]1 t1 l& R7 f6 K9 l1 I8 T) `
}
# K* f' g# d/ N' U- U$ B" E5 O {. m) P. ?( ]( E7 f( ~0 u
/* 注意乘2,处理幅度 */
s4 r: t3 f3 T! H /* %% 我发现带通之后其实就均值为0了,不用这一步了 */
+ _( m% @/ B: b9 r' s$ |' I7 b, N /* %% 行列转换 */) ?: h" h( R/ E4 z6 H
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
3 K6 C: ?' [: n/ B% ?3 O- O5 ~ for (ixstart = 0; ixstart < 81000; ixstart++) {
+ r, K: ^! ]1 t0 B youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]; E+ ~2 t: g2 I+ [& W+ o4 l
- yiDuanShuJu_mean;
. l+ B# J( Y- i# h }
9 d/ w& t% K( }) l% L1 u" U. o5 g& r6 J
/* %% 应该对数据归一化,但是这一步放在哪比较好 */
! f8 y$ [$ w3 i* I9 }: b ixstart = 1;
! K, x1 t! M3 ]& b) u& Z3 { mtmp = youXiaoShuJu_QuZhiLiu[0];
1 L! _. H$ K% a% _ if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
3 ~* `; b2 j ]4 `/ D) h ix = 2;/ n2 B, Q8 @ i( ^% g
exitg2 = false;4 [ \0 @* U; R
while ((!exitg2) && (ix < 81001)) {) I+ ^* c/ z0 b5 a$ c) _
ixstart = ix;# }# ^* O. i% }6 J+ m* H
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {$ q+ k- c2 x0 d! Z6 k' E# Q8 }, ~& D
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];+ |) f& R/ E; [7 j5 B5 I: n7 ]# t
exitg2 = true;6 Y$ [2 B. w. a, C' m. b/ ^6 k
} else {
- Y6 z/ I8 }. b5 K6 W8 m ix++;; F8 [- U! b* k( k
}# j" i1 E% {. q2 f! y
}: U: C/ A/ J$ J3 j
}
) V4 B( J9 k7 K* w7 ?
8 m% c; P8 ]7 G# B# T) E if (ixstart < 81000) {
! g$ o. i) w; u& \5 x; e, b& f- u while (ixstart + 1 < 81001) {
# }& F5 i3 M. s# l# z if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
) c j1 f( y9 d* b/ x! \ mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
3 [1 Y# {5 U/ E' y, x- L, \5 c* d }, r7 t0 p! z: d% R( H9 H
: E; v8 T: n3 x! [. |% Z+ O ixstart++;
6 A) w) V1 r6 ? f- A! q }7 G9 t% G9 b1 N- B" y; W- ?: W
}9 @3 H; T! S7 a
9 `; N; T! w. W& o$ x8 z0 M* b" u
ixstart = 1;
" f7 c$ Q2 A" U \+ Y yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
! L* x# Z5 ?; O" T7 p& ` if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
! v7 n/ t( Y5 f! P3 l- @ ix = 2;* D+ E) i( o3 J; `5 Q
exitg1 = false;
! I0 q( U6 Y( A1 R1 S while ((!exitg1) && (ix < 81001)) {
% N" s; x7 W7 S* G @. M ixstart = ix;
; j m* v. B; B, s }! \ if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {7 F& Q; H C( [& a0 V; e; S$ D
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
, d) J6 M5 t7 g exitg1 = true;/ M" r" S8 X( Y4 C9 e& v5 l! B
} else {& K! Z8 C7 @! h* a) d1 E/ R
ix++;
! m6 s x3 ^9 o# f6 X }. r$ {, \( s; x+ O+ O2 G+ O
}
9 V) F; ^* F/ T$ l6 c9 O }3 g# b) W/ C* Q, Q5 }/ Y
- Q0 t) Q5 k, L# T* F- q- B
if (ixstart < 81000) {
" I, z2 |, O3 _8 d! h while (ixstart + 1 < 81001) {
1 R, S& O: V6 l5 @/ r if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
2 Q. R8 c4 e) l1 {" h yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
5 m( i( ]: j% G9 U7 d) D }4 n7 P. m& b1 i* a9 y
4 m. g `4 U) n3 T1 }
ixstart++; j) i, V. E& f Y+ a
}
1 `5 O7 u: K" Z) T' i }
; x* J( N e) {5 U1 H, J! C3 D+ i5 I
% }+ S. {9 z' V! O# ] yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
1 K5 x/ V7 i" d if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {. E, {$ w7 O% l
yiDuanShuJu_mean = mtmp;
0 J) ?. ~& ~9 A4 x' Q$ _ }# ^7 R$ s h1 f; X1 g
: w i( g; u. N! l. w5 v5 Q! ^ /* 找出极值 */
5 V- a+ \6 v, N! } for (ixstart = 0; ixstart < 81000; ixstart++) {
! ?' M1 s$ @, ^ ? youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
. r! n2 `# u# L6 H; M }
: C9 v0 F: H3 A2 u) e. `6 y- m$ h* V1 [* M4 x
--------------帖子字数限制------------------, y) F! F# [) S4 S, `
}8 w' G; |# Y9 e* _' N- M/ }
& o/ K3 ?( K0 B" A4 ?
* r G( i9 D8 w: \: K# m9 C9 w* H+ \ |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|