|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 , ~( n2 I# F$ E# `. g5 \
* q2 K) c) h/ ^% F" r# L7 M各位大神:
' y/ R" b$ H. N s2 K 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)/ L: W, e# H( m( p. M9 @* T
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
3 K. i4 h' g# m
, [( b {' v/ g4 G
- E! ^6 @& z" g. p6 J x这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
/ v& ^( _2 [. n0 O2 F% {
6 ^# \3 l9 L2 \* i. L' z6 u4 Y并没有其他线程
0 p2 @; ~9 G. h" L: d8 [' E反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
+ w S3 X5 V/ ?% n也说不定是和堆栈有关系。。。。。。 [( o5 c" y7 U, a1 q
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
9 S- N% T: v6 s' x3 N/ ]9 K7 {& P% \7 |1 S
3 i7 J9 e. l; `4 C) b# d5 b5 ]7 e1 F" h4 x$ S
我也很绝望啊,希望大神能帮帮忙,感激不尽,!- o% L# I, K6 v# L1 X/ e6 O
4 r; V$ F7 C: E+ _3 R, e" y' ^* Q. o4 A, }& {& l2 x
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];: I2 t6 F P; i: H
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。$ Z' s7 x- s) o2 S0 _6 q3 m
& r9 O, L% t, W3 g1 ~boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
: V9 R. O* _& E& ?& s! k; f const double data1000[1000]) {
! A6 H+ G! E: r& i g
8 f/ ^" h% M3 ]: P; F. P int myfuck;9 ^( a% I s) b2 k3 l4 ]
double yiDuanShuJu_mean;
/ ?- U: }! R/ T4 |: k4 _ double yiDuanShuJu_LowMean[1000];' h) b( D( X7 U. S6 s4 R
int ixstart;- M4 s& w4 d, p3 R$ _9 p
double dv0[1000];
7 p: e* p: `# l comm_AGC pAGC;
& K! p) K/ G9 y comm_CarrierSynchronizer pFineFreqCompensator;2 ]2 ~# A0 `/ {# R! n
dspcodegen_FIRDecimator pRxFilter;
* u/ a" I# p3 p3 \ comm_SymbolSynchronizer pTimingRec; y; z3 q$ i7 i
comm_PreambleDetector pPrbDet;
8 S( k8 B2 l5 } H6 L/ \7 _ K FrameSynchronizer pFrameSync;8 b6 b( l2 |# N# Z( Y
QPSKDataDecoder pDataDecod;9 W- |$ n' W8 v( B( ~) F: K% }
static double usable_left_filtfilt[81000];, X0 _, p/ T1 ~8 B, M* x# L; V
static double youXiaoShuJu_QuZhiLiu[81000];- i4 s+ z0 l- h" y
double mtmp;# L9 F6 ]- ~/ A" @5 @8 I# `
int ix;8 T0 P) v( b- H& t& t3 H4 G1 Y
boolean_T exitg2;1 \7 u8 `1 |2 F: l* ^! N) i0 U3 V
boolean_T exitg1;: {9 O' f" {2 o
double YiZhenShuJu[800];3 m( _& O0 v: I) j r; f5 P, @
double dv1[800];
( o; y4 A* d# K" u; u! v3 G8 j6 X
1 P4 O. [* u a3 d _& w
$ J t1 U( N' G9 G! s$ p& |- Y" s double b_YiZhenShuJu[800];0 x5 C# z+ t5 r4 P! ^' m
double I_filtfilt[800];
6 q* Q9 N3 K. ~8 z! U3 i7 B! X double Q_filtfilt[800];3 F, A9 R. e* L# b J9 \
creal_T b_I_filtfilt[800];
' D$ u W: `. w* ~* E* W+ q" c creal_T b[800];- O$ f9 s% h# D# T1 p
creal_T RCRxSignal[50];
" ?, r4 L7 r0 J5 I* o2 D/ V1 |; i3 H creal_T fineCompSignal[50];
" z5 y; V! o& r$ c double phError[50];
7 b- M& g$ Z0 j6 P creal_T timingRecSignal_data[28];
$ ?$ ?5 e+ T9 I" A5 P" f' j9 c int timingRecSignal_size[1];' z5 M6 q: q% o5 G- G+ Y
double prbIdx_data[28];
. u" ^8 [; P. C( H/ d+ F0 X3 t: { int prbIdx_size[1];% _( |, [, b6 f& M: I/ W
double dtMt_data[28];5 m3 i& k7 S: e1 Q
int dtMt_size[1];" s) V4 Z( R. l. A. \
creal_T symFrame[25];
) D0 b* {' |. _6 {& r& s- G' l boolean_T isFrameValid;
8 s8 d" H6 _) k' q g2 V double unusedU0[3];
) T$ m) f. V8 ^7 @! Z8 N# d7 q+ u1 B. ]4 [
//调试过程中的变量
: ^# _* X$ d" t8 M# |- F7 b0 h& s int enough_data;
' J* s+ O3 ]5 p9 Y2 X; A9 T6 l6 p- s7 c2 w7 I4 s
int enoughDataFlag;
: r$ _0 ^! T7 ?. T$ j$ C int yiDuanShuJu_mean_int;- }% q, g$ x5 L
int int_sum_dv0;8 P5 V1 Q- F4 m3 N* U6 i
int oo;
: k9 B$ k9 h/ ^$ G int ii;( a0 A$ W# W8 N* Q& u9 s
myfuck=10;
1 c4 P4 G, K$ m0 c9 U" f /* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
2 z! G' F, ]2 Z6 W' }+ d7 l /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */* z% O- J& z1 s6 q7 z
2 e; ~3 z7 _! C yiDuanShuJu_mean = mean(data1000);
( {$ h5 W) ^0 |5 p! m
) `' B* {" o6 j; ] yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
1 g0 C. O9 A: R, [ UARTPutc('A');
2 E7 H% F' B( B. z' ?* A UARTPutNum(yiDuanShuJu_mean_int);
; H4 U4 u1 }; x( W5 F8 d1 F" V UARTPutc('\r');2 R6 Q2 ~) q. W
UARTPutc('\n');0 d2 ~, `' w8 E" z1 d/ M2 G
$ W/ r8 P g0 l5 u/ }3 p! \ for (ixstart = 0; ixstart < 1000; ixstart++) {# x0 N% E$ i2 L, M. p
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;+ l9 x$ J3 @$ ?" d' |$ A K
}8 D. A: a7 w9 n) ]
0 t! U7 |9 b9 q. \7 A
power(yiDuanShuJu_LowMean, dv0);$ c3 k* e' q4 u' b3 D8 @7 v
$ P+ H) D8 a3 V i b$ o9 M5 E
int_sum_dv0 = (int) sum(dv0);, {- i9 i( X: V1 z @* K! d( E
) @# D2 i6 Z I; E$ w: G6 G1 t
UARTPutc('B');
0 h) _: C. `: j' f% k+ ^2 W6 C UARTPutNum(int_sum_dv0);! r3 A9 |% u" M3 S$ v
UARTPutc('\r');
3 y" G+ X8 r& ^2 a) R. E2 k UARTPutc('\n');
. D4 H; `9 s& ~% q( ?4 y' f* s7 L: F7 k/ N% B" y* D& `' K% k
// int compareFlag = int_sum_dv0 > 1.0E+8;
: o" M" Q1 {6 o) R5 @
, C9 T4 S$ z" Q0 \ if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?; Y! z3 V2 c$ Q2 L
UARTPutc('C');
- b% n- ^' c% @9 a$ F7 z /* 比较信号能量 */" K$ d" }. w# B; [2 p
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */0 w2 C- g6 F' }5 [
// yiDuanShuJu_mean = 1000.0 * youxiao_k;* h' _) R6 Z6 E4 z
// for (ixstart = 0; ixstart < 1000; ixstart++) { C+ h0 P1 y/ A3 a" t, Y) Q- q
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
$ r7 z2 V* J4 y& t& `- m# ]// yiDuanShuJu_LowMean[ixstart];
0 Z9 r5 J( v5 E% I* A' [// }2 C: Y8 k8 P& V# P1 R) V
//: P }- S' V. z. X @1 |+ |
// youxiao_k++;
1 d4 i) Y- r2 t% @4 |6 h; j+ j3 c// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
' A2 s7 T4 K" \$ _& S- O( C// /* 感觉要取21个数,即0-20, */0 |9 P1 v3 {5 f% G+ ]8 i3 a
// enough_data = 10;//有效是10,无效是0, L G% V% ~) h
// }* h- X$ P% P' f( `2 F4 \" w+ N% o
}
6 ?. P# D5 p& Q) i, k6 Y* _8 B6 L( ?% Z' Q
6 s0 x1 W5 F* o, _" L; L/ T enoughDataFlag = 100;
% C7 v6 u5 U$ a) E) G enoughDataFlag = 1000;
x! r; J) x7 c& H4 p enoughDataFlag = 0x02;( ]. l! M8 c: p3 @! N0 g
enoughDataFlag = 200;! e9 T7 ]5 x7 J8 T
% R; c( ?% m9 |0 [, N- L* N
int myfuvk1;; A4 @. A' s9 J/ l
myfuvk1 =11;
' [3 ^( y3 K- ]: J0 o8 a- d' i* A; s' o* F3 P
, ~/ U2 k4 o% u% V8 V# S% D4 j enough_data = 0;
# o* ^4 K+ ^9 m9 m' k0 X% C8 W z
! S( I7 i2 Y! E& D( u1 F, s// if(enough_data>50){
0 t) j" Q* q: U4 H// enoughDataFlag=0x01;
" l/ p7 Z/ T4 m$ z6 W r, w4 x( {6 O// }else if(enough_data<50){# P9 m: f/ @' [. S) B
// enoughDataFlag=0x00;//0x00还是不行% p( H/ b9 P8 Z- K
// }1 g7 t. |6 h( z! F9 M$ e4 b
& p& y5 R( c3 f7 h! C8 s! J" _% w/ F& N
oo=10;9 j! b1 v! i5 o6 V, B
oo = oo < 5;$ w2 S/ M7 F: T {- C4 w
if(oo){; R# S( x! o; e) ]
ii=0;
0 Z$ k) p+ x8 ` }2 t& S# k* l% H' j
if(oo < 5){
" E* ]2 |. H3 u/ p, B* S/ N9 n ii=0;& L1 [8 m. ~, _4 J; L
}4 m, ]) X0 X( S" O' ^* s
if(oo > 5){( q% K5 r' `$ s. ?3 b
ii=0;
1 k( S# A/ R8 q* A3 h4 `+ K }/ K7 r( v B4 D. ]+ b
5 G% u2 K! X" {# D% u% J
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */4 y4 _! Q( P7 I9 W$ z) n) j
/* 如果数据足够才执行主程序 */. o- ]2 r& A1 m( w5 n& n
oo = oo < 5; i; x4 X5 z- [" d' I2 ~7 }, f ~
enoughDataFlag = enoughDataFlag < 5;& x: o( S" q/ t" f
if (enoughDataFlag < 5) {+ K# C/ v- M+ X) ]; V/ N/ |' }
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0" }3 B) J2 [! H9 v
AGC_AGC(&pAGC);
6 l, J8 g" _' H# R# O( C+ M6 i0 | U& e& _- @3 |2 \: p
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
/ F2 u0 u# Y* t5 J FIRDecimator_FIRDecimator(&pRxFilter);
% R0 E2 ]. ^) i4 u4 `2 M: t: Z4 x+ B' E' }$ m# I) c! Y# ?& B
/* Downsampling */
' z$ o6 i& H0 R! J8 \ W6 ^' D c_SymbolSynchronizer_SymbolSync(&pTimingRec);
/ B( @% R V! {8 ]- ?! p% w; C8 L) O
c_PreambleDetector_PreambleDete(&pPrbDet);& p3 X: E. \' U7 L, U4 _
6 Q1 P/ B& L' F/ m ? /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */; H: E* ^3 e4 `- Q% y! E3 e
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
( h- U$ g! v* [ /* %帧数量=100 */& p$ N9 X( R4 M% G! C* q
pFrameSync.isInitialized = 0;
/ |, g" i4 C' z% T+ X3 b" h
) @& \$ V+ j" P" y /* [EOF] */
+ s# f% A- N( l% C /* 前导码长度是13 */
0 I$ E# k, M) j0 Z! B /* %qpsk */' k" y* y0 X& V R8 i2 y
pDataDecod.isInitialized = 0;
" X/ ]1 R X) N) N8 C* d9 {& p8 C& z) i, b% S* q4 u
/* end */
% o' b* z D$ o. r2 J' m4 p/ y /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */, a4 _8 D/ i: Y8 O6 C& {
/* Convert 3-dB frequency */0 N, z; R$ {2 I9 V" I( [! o$ ?2 e
/* Convert 3-dB frequency */5 F8 D* n- ~, Y! n) h
filtfilt(save_buffer, usable_left_filtfilt); `$ `6 N2 n9 Q+ f
for (ixstart = 0; ixstart < 81000; ixstart++) {- b" N! ?* |% W; T: h; }( h1 U
usable_left_filtfilt[ixstart] *= 2.0;6 G& a* ]. ~ S6 E; ?
}! D& `8 O2 B- R9 N7 }1 b& P' h! u+ L
* h; I6 t) b. ^
/* 注意乘2,处理幅度 */
4 Z B+ y' W: R. W- m2 J /* %% 我发现带通之后其实就均值为0了,不用这一步了 */ h5 g i# n5 F2 p9 B! ?
/* %% 行列转换 */
9 ?1 E: M0 U: @- U+ P yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
6 |2 W4 f+ ^1 d1 Z$ J3 E for (ixstart = 0; ixstart < 81000; ixstart++) {$ \9 \; S2 a: d
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
0 a2 D, B" H6 ?, X - yiDuanShuJu_mean;
' }# M }/ o9 W+ c: B8 S' s }
2 @$ |. O5 F3 n0 {5 z- e) [, f
0 F9 b) Y+ ~. N3 w /* %% 应该对数据归一化,但是这一步放在哪比较好 */ [$ c/ l. A: F
ixstart = 1;) c9 z) X4 l5 w6 @$ l
mtmp = youXiaoShuJu_QuZhiLiu[0];
2 C2 y h: { O if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {& w8 e V: d: A8 F+ r9 p: R
ix = 2;& q& r' x/ c) k2 Q; X& d( a
exitg2 = false;
# N( e" F9 A8 I8 h: t" t* G while ((!exitg2) && (ix < 81001)) {
3 j" k" c2 M5 V ixstart = ix;
6 R @( C0 K5 {+ Z& d if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
% H9 s7 b9 d% W* a8 B mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
' b$ o$ s' g- x# V% Y exitg2 = true;' K4 X( m) {' Q) P. h0 N
} else {2 e. j# o' i$ W+ w$ B/ G' s
ix++;, g1 X0 g% A% z4 k- q' \! l6 y
}
7 i& ?- N0 `5 O, q) W' A# z }- f' q/ Y- S, l* Z4 i
}: G% H. O r+ K2 o( W' E# b
% Z0 e) e! u5 `
if (ixstart < 81000) {
% p' E% `. C) i- ~' L; O while (ixstart + 1 < 81001) {
0 s* ?9 k, `# N4 n& a8 | if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {, w& _$ Z: _2 R3 A, @
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];; G/ i5 `3 @5 Y3 o, b! R$ D
}1 {* N( T" ]" U+ T9 y) z! v( {
) D/ O1 E J+ o: ^ ixstart++;* z x8 P. `! B' s' v* x( T9 I
}! I0 H* Y0 K' ^( T& Y- H( V
}
* j4 r; f% x6 V+ f, ~3 n5 \) Y+ a# H, p% D
ixstart = 1;. ]& c; z5 l9 F, v
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];& }' Y/ z* A6 I
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {1 J# c. ~& a* `- y+ V* r+ y" }0 Q1 s
ix = 2;; V( h1 A" x6 l6 w# U. b
exitg1 = false;
4 U L: t! w- ?4 G, C+ g) T while ((!exitg1) && (ix < 81001)) {" A1 _6 S8 M$ m c6 h
ixstart = ix;
1 G; }5 |1 Z" }' d if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {$ d' n2 k4 {4 X* B
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];7 g2 }/ H3 O6 n6 C; J3 M0 M
exitg1 = true;3 _; m f& J0 P4 M
} else {
0 Z$ Y- G& {3 W% _" | ix++;
& \4 z* p* ]6 \" P6 l- ]% ~! B }- ?9 }# p5 x9 J! ~* ~
}
U& M. E: }* G% I$ D/ |. V+ D }
$ P( ]( Q. ~& n& G) M2 v! c. `# c: c' T% |# J6 D- P9 I
if (ixstart < 81000) {
" s) P3 Z; a1 b( ?5 [9 j while (ixstart + 1 < 81001) {
1 v, I5 u2 z5 C7 t2 Y* s if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {: X k3 I, K* [( V( _8 s( P! I
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart]; @, q9 k4 u/ u- |' [/ ~+ d1 p
}) E/ e( W! r, Y8 \
, a; W+ A# z- c$ d# m; w S
ixstart++;: c% i* Z# a& R4 |) V+ G9 L
}
+ o* \" x* @/ |- D- s0 x' M }# w0 |$ b. g+ |, a" v. |: F# ^
8 G( `0 [0 N1 a! `" L8 [
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
$ S0 N8 f# C( p1 m5 m% B7 r& [ if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {9 T# F; x( G/ R$ {' z' M
yiDuanShuJu_mean = mtmp;
5 X; f5 P- K P4 R4 c5 e" Q# p }& }0 O& l7 A. D/ R
# \3 G- p5 A1 S( G* U /* 找出极值 */
5 F; w) T& z3 W% F4 Q1 b3 N3 X for (ixstart = 0; ixstart < 81000; ixstart++) {/ _, r# T2 u/ G( T( M4 Y X4 Q) |
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
- C' \: x- s+ H3 W% z; y! b+ L }
* S, W! ]+ K2 f2 o
! h. S X* J+ R0 {- Z, m --------------帖子字数限制------------------
7 f0 h5 [: N) W- F}
0 c% w3 A* w. n# m$ o& l Q7 j4 s' g1 [9 I, U. ^. K& w
5 O# a$ z* I C. V
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|