|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
1 q; S* v5 H1 e4 }$ u# ?6 |+ G l% K* `9 _; ]* q ~* t1 x3 [: Z$ r
各位大神: K% z& S" f9 s. w* {$ p
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)3 G2 w" o+ x4 O" l$ ~% @1 Q
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:! z y B o- C" c
! L+ S/ I. K# n
! t, }9 W: R3 }. h这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
D- d1 Y: b: t4 c: Y
% B+ j1 b, ^0 E J4 u+ i% ~并没有其他线程
) v) o' J) F; X/ `3 O1 K {7 c% n9 X4 i反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
9 w8 L [) E0 S' o& F5 s( b0 g0 X8 u也说不定是和堆栈有关系。。。。。。* c) A$ k/ e( g* p! o: {. j; E
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....' U5 W0 B% U9 m0 `+ a! o
( v7 i, [) a& e& w1 p" Y
8 A8 j! t* [8 L2 o) p$ p3 K
. w: n* K* U/ E, p( c& x( `: ^8 j
我也很绝望啊,希望大神能帮帮忙,感激不尽,!
9 J5 l6 f, T& j* o
/ z. c' z* W4 `& g2 |1 r3 o% X/ m+ ^& L: r( m
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
" d! h( \# @' q9 g0 x5 R5 [ static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。3 t3 j" r1 F! z
! l& ^2 \0 J4 d: T1 ^
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
* s! P: o* e4 ^+ p3 J const double data1000[1000]) {
$ Z9 Y3 l- A2 @# q/ ` i
/ a) l$ }* K3 P: V. z int myfuck;
" Y0 ~! L! e" x5 W3 H1 v double yiDuanShuJu_mean;8 c+ k9 ?3 n$ e3 ]- g
double yiDuanShuJu_LowMean[1000];
2 r8 l/ I" b* b: {0 H. Y+ y int ixstart;+ ^- [+ p8 v- E% q I$ E4 g
double dv0[1000];7 S, Y. ^' ?# l1 A
comm_AGC pAGC;
: g" N* D( t' R3 _8 }. {& P7 `/ k comm_CarrierSynchronizer pFineFreqCompensator;0 u* \ z7 q7 }3 Z t0 t0 }
dspcodegen_FIRDecimator pRxFilter;
' @" l% P2 G. N5 B0 e1 P comm_SymbolSynchronizer pTimingRec;. Q( {6 A5 w" s& N7 i
comm_PreambleDetector pPrbDet;5 Y7 J i* a/ Q. ^
FrameSynchronizer pFrameSync;0 x, ]5 S% q: |; f* r. W
QPSKDataDecoder pDataDecod;
4 a# B3 A, y' N$ n! R0 S* t static double usable_left_filtfilt[81000];. Y r* q/ `# m6 P& P0 v: J
static double youXiaoShuJu_QuZhiLiu[81000];
; f0 V( @0 ?/ M+ L$ [ double mtmp;5 |( [: f- y5 V0 } B: ]
int ix;
" d- ~0 C4 Q* h: s$ _4 w" m boolean_T exitg2;
) N5 E) b, B4 N; {- Y) q boolean_T exitg1;+ s# N2 J# d& d
double YiZhenShuJu[800];: M7 [6 M( [$ y
double dv1[800];
) B2 M2 K# u- t z9 q- a9 x' l) q3 b Y; F8 f0 i# B
! B% g- U" ?' u2 r4 h; @: j- S
double b_YiZhenShuJu[800];4 Y1 m3 i+ \: O- d1 M
double I_filtfilt[800];; t& @5 b& j" v% ~
double Q_filtfilt[800];* O# j5 j. d; V; d
creal_T b_I_filtfilt[800];
* c. n) W" u* `2 X- Y d3 H$ n4 i creal_T b[800];
3 O" y- H0 w+ G% Y$ x3 q creal_T RCRxSignal[50];9 {8 M! y- ~% V0 p& U8 |
creal_T fineCompSignal[50];7 P4 _) n. [; ]* i! @ w/ ]
double phError[50];
. p5 T6 }1 m) x: n0 ]4 u, U3 L! n creal_T timingRecSignal_data[28];0 K3 Z8 K# _0 @; c1 \. T
int timingRecSignal_size[1];
+ \3 b. B2 I: W" S" ^0 \3 ` double prbIdx_data[28];
; |; z0 ^$ e% r int prbIdx_size[1];0 H2 b$ L3 J k) Z+ e$ ]$ r
double dtMt_data[28];
, A+ \, d+ l' V int dtMt_size[1]; j( `2 C) ]6 V( n9 C" a: y$ U
creal_T symFrame[25];1 i0 e( a) N' S; F% p
boolean_T isFrameValid;
# L. s; e7 d6 }4 c9 s double unusedU0[3];
" q4 C5 g! g, a0 {
$ G( k8 V0 A- Q( K s //调试过程中的变量4 V( ^% d' o- \/ E
int enough_data;
0 M, ]7 y1 {4 d. y* I
1 T* p. q& V# k4 d) @. W; v8 H int enoughDataFlag;
8 ~! |% f) _0 W) o, ]1 Y int yiDuanShuJu_mean_int;* ]3 l% T! f4 d
int int_sum_dv0;
; r& P+ S6 s, ~( g7 b) g int oo;
6 b( h: r$ h9 a int ii;
1 `' u% H. f- ]# v2 J myfuck=10;' k6 s4 f: y& f5 G' C' P* L
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */3 j; U3 M ?1 P! ^8 \7 W
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
+ @( [6 R6 h4 X! C; @& L! V8 k" l0 b" h) w6 L' m
yiDuanShuJu_mean = mean(data1000);
8 E; T4 y' e* l% W% n8 P4 U7 ~6 C' ~ }' o5 O
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;8 d5 z p) l* o7 S
UARTPutc('A');
" N5 ?" R9 v. P UARTPutNum(yiDuanShuJu_mean_int);& V) C* R; f4 y$ l$ E
UARTPutc('\r');* G9 B5 v4 `& U6 w/ @
UARTPutc('\n');$ V5 n( A2 \# s! Y& ]
5 n0 L# b" Q+ R4 w
for (ixstart = 0; ixstart < 1000; ixstart++) {
H% k9 ~6 G9 p. X0 } yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;% I- W" e9 k+ t
}
. l- @; ?4 h% h) W1 u% Q2 _/ J* }! A( @
power(yiDuanShuJu_LowMean, dv0);! b0 G- [, t8 r% r0 C& \# A
1 W" s# n2 {; E* e$ ~) f int_sum_dv0 = (int) sum(dv0);
* U" @9 S! ~; A" N6 X
: @# Z+ @+ r) m3 `% w0 j UARTPutc('B');/ V+ ]( s0 e5 h) L# E: I2 I/ A' F
UARTPutNum(int_sum_dv0);
/ C5 t7 l$ Q0 ~: b6 ~" z UARTPutc('\r');
0 e3 l& @5 \, E8 b: b8 {6 ` UARTPutc('\n');
, \ w! `; h0 Q) z- K# @! Q$ b1 r! I7 J) J1 X. Q8 @
// int compareFlag = int_sum_dv0 > 1.0E+8;
6 T* n+ g0 [8 B8 R" @. A
5 e' d& E: o- n$ e; D if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
" j0 y9 L5 D- [! A- t( Z UARTPutc('C');: v2 G4 |7 V7 |: ~8 F* c) q8 @# N
/* 比较信号能量 */
' u6 c; }2 B6 B. h" B1 M8 r9 _ /* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
' A8 [; h) g! t6 ]) b4 }// yiDuanShuJu_mean = 1000.0 * youxiao_k;) u+ `2 i) V# s6 S/ C5 B$ E) C/ i
// for (ixstart = 0; ixstart < 1000; ixstart++) {
0 m% d! N( o* A$ K2 c# F// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =# o/ k- o' a% O0 b. S! c% I
// yiDuanShuJu_LowMean[ixstart];6 O& b7 D5 u- r! K4 t
// }! N, b1 e( n& ?8 U- w, J
//% p0 D0 B3 m$ w4 B* ~% ^* x
// youxiao_k++;- C9 o% [+ f6 ~; f4 p- Y5 j* D
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
3 b3 ~- `* M3 D" _// /* 感觉要取21个数,即0-20, */( s; F+ ~& R9 {
// enough_data = 10;//有效是10,无效是0
) y/ P4 Y" i2 Z5 A0 Z- l4 P3 P// }% }' C7 F) Q& j" S5 ?- x7 D& P
}
4 J- ~' W7 _' @* @9 j$ a. N* {3 V. {* Y$ N: k2 [
0 |& Q6 x. z, h3 H* P1 i* t5 e
enoughDataFlag = 100;, q, X" @, x8 G% }: i
enoughDataFlag = 1000;( P# V. U/ v8 v7 }3 l8 H; |
enoughDataFlag = 0x02;( X6 R1 p$ A% ?4 p
enoughDataFlag = 200;/ W3 V2 K& J0 X6 @
: O& r4 O0 I& @; I0 j# y
int myfuvk1;
+ M" g% J, t7 B myfuvk1 =11;: t; H- B3 Z) v0 c) \7 ^
* ]: G' z) N9 ]( x5 n5 }
- o+ n8 ]5 D( O
enough_data = 0;1 k9 D& p) E* Q+ c* d
0 ^; A$ q0 @1 v7 H0 F// if(enough_data>50){
$ P. s+ T- F5 k* g1 F4 H' Q/ O// enoughDataFlag=0x01;- X4 J! j* k; ^
// }else if(enough_data<50){8 K" I/ M$ ?# o$ q! n" U
// enoughDataFlag=0x00;//0x00还是不行
1 }, Z* L8 R) h// }" K! E$ A0 d1 m$ M2 M$ V! H
8 @! A1 M6 Z( M; J1 [0 q) \
9 W# l3 _5 w! R$ a oo=10;& v6 t- y: ?5 w% W4 R
oo = oo < 5;! y% k" v1 X3 S) d" o$ Q
if(oo){7 z' V7 G& p8 P% d5 i; E% C. Q
ii=0;
5 P" o2 S+ B5 m }
/ t# S* Z5 k/ S' l. {0 K if(oo < 5){" W' ]4 x* A: H7 o/ Q: f2 w& n* V0 M
ii=0;
8 U+ P$ o; E- z# w9 t+ l6 z }
+ `2 E$ m' n2 ]: P if(oo > 5){9 m: A6 o U0 u5 K
ii=0;( R. L1 ]% v/ ~! f! K. C
}
/ A& ]. Z7 S! w, ~+ q1 d+ U' P9 b: n0 b/ @8 X
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */7 S, k/ g: g" C# l3 d' Y
/* 如果数据足够才执行主程序 */, E5 I! W9 ^- q6 H- Z E( `
oo = oo < 5;$ V: F5 \; p4 _ r- S
enoughDataFlag = enoughDataFlag < 5; @, ~& k% W* |
if (enoughDataFlag < 5) {
$ |( I# c- e+ t) n0 l- h// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0, l4 K" G. i* v, x# j5 x! U+ [7 }4 k9 n
AGC_AGC(&pAGC);
% f& E) p4 V& d$ B& t+ K# D5 \/ z% r3 p) y. g8 P( @/ r
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);- K9 K9 u1 x8 M3 l7 _; O
FIRDecimator_FIRDecimator(&pRxFilter);
3 A: a: ~0 o6 g( v1 j( O- W5 I6 d3 N* s9 u. Z
/* Downsampling */2 s# ^6 n" q. y& q: _" d1 v1 |
c_SymbolSynchronizer_SymbolSync(&pTimingRec);
7 q# {9 y* M1 W9 Z6 Q/ m
! a# O1 x, m* ^2 h5 t c_PreambleDetector_PreambleDete(&pPrbDet);
& c5 r; _2 T' |# J c9 ~5 v, @( Z0 h8 L% J9 R
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
) R0 W! W$ @2 D. i' \* T /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */3 A3 I3 q9 e9 w! z* D# Q
/* %帧数量=100 */
4 D. ^7 C! ~3 }' _% \. r' I5 _ pFrameSync.isInitialized = 0;
% J2 {2 L& P8 a: @7 R( }9 E# [3 b4 P$ z
/* [EOF] */
6 Z: f) u2 Y- }! Q0 A /* 前导码长度是13 */& [+ M6 X* o4 K& v4 h/ X" c
/* %qpsk */
6 N# d) s' a$ Q8 u1 H- \: f pDataDecod.isInitialized = 0;' H5 t. Y1 P% n, Z: t- s7 w
* F% a0 V4 u, @8 z }
/* end */
9 n1 H/ S% A4 Q- s6 s$ u /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */9 D3 k' L; G; c9 ^* k, v) r1 N) k2 B
/* Convert 3-dB frequency */
( _- z4 O+ {7 f/ Z; I8 u /* Convert 3-dB frequency */
" T- Z! b3 p) Y" Y4 m filtfilt(save_buffer, usable_left_filtfilt);6 R* _/ v" d- n
for (ixstart = 0; ixstart < 81000; ixstart++) {3 X; k7 D" f) s
usable_left_filtfilt[ixstart] *= 2.0;
* w5 s4 a7 x _% a$ k }
0 i" Q+ x; ^% u" V3 b3 F6 c: ]* b+ m+ M6 R
- T' @4 _4 h, o7 \* [ [ /* 注意乘2,处理幅度 */
8 u/ H4 `8 a1 B: M5 E& k. ?- Q! v /* %% 我发现带通之后其实就均值为0了,不用这一步了 */
$ T4 e7 d% Y' T /* %% 行列转换 */3 i _4 I; C% [
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
) g5 G& z! C4 |4 V0 W) m, X for (ixstart = 0; ixstart < 81000; ixstart++) {6 [1 ~( H# a8 G6 R9 \$ _, {
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
' V1 t6 Q* U1 s$ o6 d2 k' ~4 M - yiDuanShuJu_mean;
% C7 Z- J$ R S+ H }
( ~- \- X1 @$ m: T! N+ o9 ?% S' X5 V4 p' \+ u A
/* %% 应该对数据归一化,但是这一步放在哪比较好 */& ^/ L2 ?' L2 |
ixstart = 1;( ?0 p- x9 R6 ?9 V* V- a
mtmp = youXiaoShuJu_QuZhiLiu[0];9 j9 ^, z9 z. d7 u' q
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {. F( W% B( \7 L* [9 r* v
ix = 2;
* L {' `1 s+ Q' r _! X exitg2 = false;* W* K" c' }8 l
while ((!exitg2) && (ix < 81001)) {
$ Q5 C& C7 ]& i; o8 l- V ixstart = ix;- l. Z# g- q; p2 `
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
2 J9 M8 v8 p. t mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];" r9 V, j+ D# N
exitg2 = true;" ]$ t5 x6 @$ L5 N6 U
} else {+ i, u1 V7 c5 N
ix++;
! C) W# P& J$ B6 d o! L( Q4 t- | }
' k, J" s: B5 D }/ G( `1 K' F) m- z
}" x/ S* C9 C7 F$ k9 b4 j" l4 k
2 f# _8 |. \2 M$ L' v8 G
if (ixstart < 81000) {
: L5 g( B0 Y8 T8 B0 Y" @5 c while (ixstart + 1 < 81001) {
" R% |: h& L3 R if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
' q$ |, z- }" T4 v* A mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
* \4 B/ o7 x' T% D* @7 } }# N: W7 A" [3 E8 a# D% a# G
w1 \7 Z W0 [: p0 S ixstart++;
* [$ b8 a: h) ]% P }
3 f% W: f9 x3 i; I+ b- W }
' f( I! L8 v4 S% c( H% i! D
: p" ?9 g: B: E* s" S ixstart = 1;# R, B2 i4 Q6 u. `" r" j8 D
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];. ?! c2 V$ p3 `
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {- d6 o! ~' w E# \5 [+ z& X8 X0 j
ix = 2;
5 w( Y2 T+ ~$ g& G exitg1 = false;% ^+ p4 F) j$ }, K
while ((!exitg1) && (ix < 81001)) {
5 c# B# M( ^' n8 ? ixstart = ix;& L# l$ @$ t- k) W
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
. @% c1 b7 J! h% a' k yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
* b1 a! q& M, N; S& ]9 S+ e8 m exitg1 = true;
$ N$ e5 X/ ~( I; j9 ` } else {
5 F0 S3 R" I; s: K* v ix++;7 u# h/ h3 ]- `6 X$ c3 b G2 k+ G' S. w
}5 }& l3 ?# ~5 }& r" z0 w% h
}9 V" J% i- }, ?5 S
}
0 a2 E% U: }$ m; T& f3 A: G" k) e
: t8 \% x! X) J% W' @ if (ixstart < 81000) {6 Q4 H2 ]. B: H" [9 n( Q' W& j
while (ixstart + 1 < 81001) {/ \- h& Q f" }1 s& x
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {# r* [) ~1 i) K
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
+ L8 f( Z5 f- t) c/ n) n. t }
' @$ W* U J5 q# J2 l# D0 |! u. Y, |5 r) w4 e$ J
ixstart++;3 }7 F" g) q' e
}
1 e7 u" ?7 Q; r9 N, |' `2 {& u1 | }
6 P" i1 s! Y* u# l* s% L% ]+ L" C4 z$ i6 c' o
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean); z2 C u( d+ n
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
% D/ ^( V6 Z0 V' E, ?, C$ S/ V yiDuanShuJu_mean = mtmp;" H0 H; G& ^" _, k+ B$ o2 Z
}
}" _0 d+ m) I1 v9 @7 R
# q0 u/ r3 z: I/ Y /* 找出极值 */3 l/ V! j. N# `+ B6 f
for (ixstart = 0; ixstart < 81000; ixstart++) {
. h( W7 D1 E3 Z4 y$ X youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;) F: o" E" S/ @8 b9 M+ {
}0 X5 w- l+ f! o/ z: w: t
) f/ C7 A6 @1 i+ ~ --------------帖子字数限制------------------* }8 o: s3 j J9 |- a; U( G
}3 \: C! l7 r' e( N1 R) D4 C/ R
7 I2 g. y: C/ y# f
% }" i. a/ x) T |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|