|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
9 @. e' a% `6 M& ]. J+ `; H% @* X g6 ]% T0 p M. @9 p
各位大神:
1 R1 P- |% g+ y- o+ U 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)& H6 W: n# G. ~' i2 V
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:( d# M3 \3 y7 N( v) L9 c' D
- }, l( Y1 ]1 I% F8 q9 Y( b
1 H9 M/ m% u$ d; ~6 ~这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。# o: `1 Z+ e' _' b6 r2 p1 h! ?
; o1 K1 E9 T2 H. ^$ R并没有其他线程
; }* W5 J; c) [$ U6 \0 ~$ s& D ^3 e反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
! W* {: R/ Q- k8 \9 |也说不定是和堆栈有关系。。。。。。+ J' E( B5 M! A" T8 Q. {
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....( |5 c7 {. I; l
- V. |0 c0 {* }
- W3 k7 [1 x/ l6 x& e
( d. ~$ x A1 s: [/ {3 J: l) M我也很绝望啊,希望大神能帮帮忙,感激不尽,!3 f. c- y! ~0 R- L
& T, k- h/ P9 ~. ^, [. D# G+ H
7 k$ R: y9 y1 S) c: _+ ]* i, V% ]/ G附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
4 y# _+ f% O6 g& w! B static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。/ K) F4 M6 ]5 j6 ]
4 {0 K2 a& s1 O& P. _boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
0 j6 u. z5 f7 l$ J2 t7 b const double data1000[1000]) { Z2 P' ]7 {$ @% ?
/ i5 [- c0 [, l2 W/ H* t) }
int myfuck;, a" A* J1 g) ~ g+ h
double yiDuanShuJu_mean;* N( J7 q% \& Z4 ~
double yiDuanShuJu_LowMean[1000];! _2 \4 t1 Q' a3 _! k1 a
int ixstart;
3 D" @+ L3 A% l- O( E& ~. j double dv0[1000];
+ @7 g6 U* `8 g7 d comm_AGC pAGC;
5 V0 `( z" ^' }( W- L: f comm_CarrierSynchronizer pFineFreqCompensator;
5 [$ C! g* w b dspcodegen_FIRDecimator pRxFilter;3 y& {7 s: b, p( b; u8 B5 f
comm_SymbolSynchronizer pTimingRec;1 R' [) C! T6 G( R, T2 I
comm_PreambleDetector pPrbDet;7 N& S# E. a; V- }
FrameSynchronizer pFrameSync;2 Y+ X; P. D1 {: \& k: v' [
QPSKDataDecoder pDataDecod;
8 V1 Z* l2 ]" s; E/ G+ p- z% p4 Y static double usable_left_filtfilt[81000];
5 k4 c0 R- X# I4 @- K3 j static double youXiaoShuJu_QuZhiLiu[81000];
- G3 g# u6 o. p4 L. g double mtmp;% l8 u$ v. _5 L
int ix;
+ I& Z* l, H& e2 u boolean_T exitg2;
6 x% m9 l3 ~3 k6 } boolean_T exitg1;5 K, J- u" X- R) l/ y+ q6 e0 U
double YiZhenShuJu[800];- S+ ?2 i8 c- f- T
double dv1[800];; b/ C/ |9 d! A4 g8 X' h
8 a1 s( T# o; T
6 c' f" u/ f, B
double b_YiZhenShuJu[800];5 U6 X* p/ B$ l5 a. q' \5 M
double I_filtfilt[800];
7 k5 i: V. Z; p$ S double Q_filtfilt[800];! i' b# g0 W, k' P- @# A
creal_T b_I_filtfilt[800];
2 P- u- z2 J$ E: f& z8 X* @ creal_T b[800];
! g R( j2 Z* n! \* i7 z creal_T RCRxSignal[50];
1 b8 m+ M4 s0 r- V# m7 N creal_T fineCompSignal[50];
" i) G+ i& m# Z9 m7 } double phError[50];
! `6 I! @( Y. G, c, y2 O8 | creal_T timingRecSignal_data[28];3 B1 z) M7 V6 i8 x/ K* M
int timingRecSignal_size[1];
# ]1 H; {, ~9 R" n! o0 Y- y- } double prbIdx_data[28];8 \. \6 T) r5 A# t& b: c' n
int prbIdx_size[1];5 U1 n* ]2 Z" \4 E* }
double dtMt_data[28];
( f7 X8 U5 ^' S; @ int dtMt_size[1];8 }8 p; v2 V! J/ ?% f+ A u
creal_T symFrame[25];$ m; i2 C3 E+ w' \
boolean_T isFrameValid;4 z ?$ ?8 s8 O% V) _' z- D4 s9 R; k7 |
double unusedU0[3];
0 y! v1 u d; ?- ?9 X/ P, b7 d% K
//调试过程中的变量
4 `5 V0 x' B% q, c$ Y int enough_data;9 t, F( l1 x0 Q* q( b: [5 l3 B3 s
3 E5 ?; r, `$ Y# R* |, ^1 i
int enoughDataFlag;
7 j- I9 j; Z) D int yiDuanShuJu_mean_int;/ w+ {2 `+ B8 i/ \4 I2 h
int int_sum_dv0;
6 ^" F6 I' y# }/ p1 D/ n, I7 w int oo;( X: x& _! o2 h4 }
int ii;1 p- d# d4 `) P. v
myfuck=10;# Y% A( }6 K6 W0 [ [
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */( A3 Y7 X/ d# ]; R2 W' J( @+ U
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */( S" o$ V( g5 s8 h6 d
7 l3 k) Y6 ?( j6 x) v
yiDuanShuJu_mean = mean(data1000);
- n' b4 X7 w8 F3 c' Q j, }) R( H% t7 L8 q; H
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;) S; V1 V) b5 i+ n/ b5 M
UARTPutc('A');
" T! m: c5 } T/ T+ s UARTPutNum(yiDuanShuJu_mean_int);. Q4 w8 T9 o2 `
UARTPutc('\r');
6 ^ F! u" M' O* Z9 ?" c4 V UARTPutc('\n');
0 B" m" O+ W2 \. T) a3 d* F
' G' c J9 V' B, K- c for (ixstart = 0; ixstart < 1000; ixstart++) {" N M& K7 \6 a; Z0 e" |
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;2 b$ x/ @& J0 C* e1 Y9 a% X$ z( ]
}/ h) C8 x6 _4 p" i
. d# z. y" C" ~9 _! C, Y! _' Z8 j
power(yiDuanShuJu_LowMean, dv0);* K- F0 d& P4 `
0 A9 P* }" ?( K, v
int_sum_dv0 = (int) sum(dv0);$ @- W! R/ M( W1 H
! B! m1 C9 q0 r+ X, K8 J UARTPutc('B'); ?9 ?. i# a4 {
UARTPutNum(int_sum_dv0);
^( y+ U: X8 f0 N0 K UARTPutc('\r');( R# [7 R+ w% E! d' f9 ?
UARTPutc('\n');* t# J$ d. Z+ U7 m
7 a) b6 l; V, O6 g' |; s
// int compareFlag = int_sum_dv0 > 1.0E+8; B( X# m6 ?) B. f. g5 f, s
$ y) V# ^: R/ @& c5 H5 [4 V" f, u
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
, }- w4 i) D& c UARTPutc('C');
2 u% z2 f) i% G" y /* 比较信号能量 */
- q! R6 y- ^- e/ m /* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
' N1 S. {/ e& M+ W( l" k// yiDuanShuJu_mean = 1000.0 * youxiao_k; a7 {1 o5 Y! s b5 I
// for (ixstart = 0; ixstart < 1000; ixstart++) {
5 k& P, C& e+ o1 w) ^1 F [// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
- _" d4 [+ P. \, c% v// yiDuanShuJu_LowMean[ixstart];& I" U4 u1 l9 B* u6 Y
// }# F/ H+ t, p2 ]' |
//( Z* M, A# ^0 ]6 q, |% b
// youxiao_k++;
2 B5 r& S3 t) ?/ g0 S* ]8 |+ D6 F: T// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==, Y0 w7 l. [6 U6 M
// /* 感觉要取21个数,即0-20, */* Y& p' b/ d/ F9 J: L6 D$ l
// enough_data = 10;//有效是10,无效是0
$ j. n$ t+ d: I# a7 Q- c- T7 V- b// }
9 G9 u1 y2 u8 E9 g; ?+ B b } u9 _$ f5 f" ]8 Z# q
4 k6 j1 o: j" m( T) |8 H; j$ m- Q# }9 y8 z
enoughDataFlag = 100;
& w& t4 g E1 G3 E% ` enoughDataFlag = 1000;
0 X8 M6 ]0 d3 a enoughDataFlag = 0x02;
: O$ c8 }8 h- a9 r enoughDataFlag = 200;
+ s! X% A: X& f2 U* o# O- {; y7 A0 ^$ G7 ~5 G- p) \0 P* a
int myfuvk1;3 ]' U) a7 y$ ]0 ^
myfuvk1 =11;& B% t7 e+ e5 F+ _: W: P: k2 K3 E0 ~
Z+ Z5 w, A3 ]8 _% U
/ ]& |+ w, T s8 A; j: I4 t
enough_data = 0;: A9 K( h+ ]+ {6 i5 x" X
! g# k6 m u- c4 N, Q/ e/ J! |// if(enough_data>50){
6 r2 \6 _( \. _7 b/ A# d9 k// enoughDataFlag=0x01;/ `+ K& r& H) {8 |) U! M
// }else if(enough_data<50){
8 E; g7 @7 b: g" e// enoughDataFlag=0x00;//0x00还是不行
9 O, d, C6 {. k) F1 y- e& U; J// }
( L+ J3 e9 ?4 o) Z/ C8 T0 Q3 X0 {: h: m' Z. G
& b# I8 w. p2 ?, I" u
oo=10;0 k3 a% z, ^! y$ o1 A
oo = oo < 5;$ h4 Y0 u0 U: W9 | r
if(oo){+ J$ P' |2 v( H
ii=0;
6 X, b" E1 v1 A% B' x0 P4 h }
2 R7 Q( ^( _) ?. M, k if(oo < 5){+ E* Q& V, [) l* c
ii=0;0 a* b7 B0 q, B4 d
}
0 J1 `5 r, }3 E; n" u6 r if(oo > 5){8 c" s G# C. @- }0 r0 w& X1 P
ii=0;
) ]# v( T5 {0 J0 e* F V0 H( ~ }
; A/ M. }' W- |
# M' k6 G# r6 ~9 z4 k6 P, b# Z /* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
% ^6 I; Y' Q3 F /* 如果数据足够才执行主程序 */8 O2 y; U; p0 o0 [6 l4 F
oo = oo < 5; L/ G: ^+ b* W
enoughDataFlag = enoughDataFlag < 5;4 m, i7 C5 a' G
if (enoughDataFlag < 5) {6 ], R, g6 j; o( q5 D; M1 L4 d
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
- K7 ]/ v* i- ]9 \, A, a1 @% U AGC_AGC(&pAGC);
& y; N0 J+ } a! |% V! ^
% c, O7 D! [ _9 n! E+ Q c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);3 o2 o9 J( y- [
FIRDecimator_FIRDecimator(&pRxFilter);1 x9 r% h, A/ Q6 L0 Q) K6 z
+ x6 f) Z/ e5 I8 u7 Q. w8 z /* Downsampling */
- P& C- S2 y. V- P4 {8 a( h7 Y+ N c_SymbolSynchronizer_SymbolSync(&pTimingRec);
! ]' c# W# ^# }$ ?6 G5 V K, I0 _/ v" A
c_PreambleDetector_PreambleDete(&pPrbDet);
3 }4 L: E5 }/ M" {0 [
* R* P" h% w5 w* G, G /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */2 x5 O; q" z+ V( ^' R
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
; @# w9 T. K' y8 s- |$ W /* %帧数量=100 */
5 G6 ]5 a/ {# W) b$ @' g0 ` pFrameSync.isInitialized = 0;
6 D/ h7 |# F8 v P* H0 A; {
$ Y; s7 P5 q) t3 o% m, ? /* [EOF] */
* f% V3 C& ]' b! c9 p6 y3 E& R* O /* 前导码长度是13 */2 t7 M$ L# O. ]; t
/* %qpsk */
, ]& s4 j2 ~9 O! ?* s& ^ pDataDecod.isInitialized = 0;
& M _, g1 \7 b3 ]% ]7 l. J' M- H/ h; @8 ]' j& v
/* end */$ x0 J: R6 B' r; d3 N0 H
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */7 P5 Z: x3 U- y n" \$ R, T
/* Convert 3-dB frequency */' ]/ X2 B8 | Z; L+ } |
/* Convert 3-dB frequency */
# ^% L/ U: g, E) X8 v0 V1 @ filtfilt(save_buffer, usable_left_filtfilt);
5 v; _2 h) }( m for (ixstart = 0; ixstart < 81000; ixstart++) {
& z3 o+ r% F0 a6 ~ usable_left_filtfilt[ixstart] *= 2.0;2 b H) F2 C+ J6 j2 O8 u# u4 G
}: n6 y6 p2 `' f; ^" |+ q
, J7 u& S& J) A$ c2 D A; |6 @
/* 注意乘2,处理幅度 */
) l1 q* u6 h) Q2 I- s4 ]% f /* %% 我发现带通之后其实就均值为0了,不用这一步了 */- Y& K( f8 Q/ a9 }+ C2 I5 i5 m
/* %% 行列转换 */2 H& l) X; O0 Y8 f- d0 P
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
6 w0 M" k b x: O+ V for (ixstart = 0; ixstart < 81000; ixstart++) {
5 @6 F+ V8 S2 H- c5 F youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
( G4 y6 [5 y K! v0 e0 L - yiDuanShuJu_mean;7 `. ]' \" q2 ^8 ~% }* B. }
}3 a: O* i/ _; y. g! C- _
' L2 r4 m a: F7 J# U1 @ /* %% 应该对数据归一化,但是这一步放在哪比较好 */3 L! \9 E2 G; C, \ [/ f/ L
ixstart = 1;
. O7 T e7 [5 n) F/ I: _ mtmp = youXiaoShuJu_QuZhiLiu[0];& n C7 E; d" [, n7 B% j
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
8 T9 _6 h1 p- ?$ M ix = 2;
2 H+ i( H! a# |$ q. }. O% C exitg2 = false;9 `5 b) g- W6 O) B$ x
while ((!exitg2) && (ix < 81001)) {. r' b9 A3 Y" P1 S$ G6 i" `$ L
ixstart = ix;
7 e" }* B/ A$ F if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
: N3 g1 i1 W: J# S+ Y5 F9 g1 O/ k mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
6 L; Q8 g2 V9 Q exitg2 = true;6 N! {) V9 G. C# J! r, j
} else {0 X' R1 U/ @* | V4 Z6 p0 [
ix++;& S/ S3 r, J6 [% N6 Y: X
}
9 ^' L% [. u' j3 g" R. G1 b }
) \# n5 k) W& ?9 _$ e }
3 J2 H0 W4 z* ^# t! n) x* e% X/ B# h: l3 K/ q( c) j
if (ixstart < 81000) {
; M% b8 u) D1 H6 z while (ixstart + 1 < 81001) {7 W% h5 x7 B( L6 f
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
( l1 b9 K( n/ J. @; D# k. x mtmp = youXiaoShuJu_QuZhiLiu[ixstart];5 u! d- u6 i% p3 P3 b, ]8 h( b2 V( t
}
* r+ ~9 s) E7 A& x( R# F# W& T# r, G6 W
ixstart++;
+ k; X1 l& b/ v$ X6 e+ h; z! m }
9 \/ w7 s$ k4 y }6 h# v8 n7 `. t4 z: u: h+ X F
& r+ m! e, W) t* `
ixstart = 1;$ X$ ], v7 J# b/ ~& [% f. }
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
8 J3 B2 z/ C* x if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {& A$ K; O9 F S: o) Z9 t; E# k
ix = 2;& @$ {* c2 Q% J% v: V
exitg1 = false;
3 i5 \+ N5 e- \7 ~ while ((!exitg1) && (ix < 81001)) {
0 X: ]4 p& [! f3 h ixstart = ix;+ i9 ?1 P+ V. G
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {5 e9 G3 a! b6 I$ P- ]2 a
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];2 \/ Q2 B) ~# H2 p+ t1 x
exitg1 = true;
, L7 D2 [3 I" e: h } else {, E; h" |. ]! z1 O8 f" ?+ @
ix++;
% H' K8 m) B( N2 b: L( J }1 a* G" E- D0 Z$ U3 ^( X% P a
}
# n) K y- s' ]# R9 w }
; [3 Q, Q4 d! ?" O. Z( l, h0 t! x# o! w9 c1 d( G+ t
if (ixstart < 81000) {$ N# x1 J2 L* h6 y; x2 b, J) k
while (ixstart + 1 < 81001) {; V4 w6 b" e5 k. H9 q8 P2 n
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
4 n" G2 K3 Z; y; I# z: S# S yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
1 E4 P7 J4 q( ~2 J1 L' Q }( f5 T/ Z2 i& E/ o
/ q* S. ]6 C& f J: ~1 E
ixstart++;
7 A' w- W6 w' h ~. Q! H! I }0 }, s9 T6 `* |% Y/ P* [! ]
}; `, C2 Q+ z# x+ X7 G' d
$ V v3 S8 [ k% _" U
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);! o& {) Y; Y+ t6 [
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {1 ]8 c- ], S% m% ]6 A
yiDuanShuJu_mean = mtmp;
7 ?4 j6 t) P$ r# X( L* z6 Y3 q3 w }
q0 ^- M- P7 i
4 Y% D6 t* M8 B /* 找出极值 */" E8 ~. z0 _, W- C7 b) p4 I' t8 d" o
for (ixstart = 0; ixstart < 81000; ixstart++) {
9 q @% P$ q8 J; u4 f& ?5 @/ w- ^( U youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
2 C# {& G; S' F7 t+ X( U, v& o }
3 p! M; j! V( ?
) g, D1 J7 n# ^8 Q --------------帖子字数限制------------------4 } C& K8 r- K; s4 t6 z; j
}& I+ S5 `3 Q1 o
5 i+ ?. }' x; H, C
% k7 w7 w5 C+ u |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|