|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
3 z- C$ P z' U& s* f7 q" h+ }! X# y ~" _: f9 }. ^
各位大神:
: U% V G8 V2 Q 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
4 m8 W% {9 A1 Z- |5 H3 z 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
6 M W3 g7 N4 g1 @/ l9 a
4 @8 c/ }) v" H* s3 X2 C& N
: g G/ [7 W+ z这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。6 m: h( q+ t; G9 ` b" u5 X
/ T8 W" ]' }3 V+ ?. y c并没有其他线程
" u/ K1 g. x% Z- f/ U$ H反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
/ K' [: h. c+ l/ r# E! [0 k也说不定是和堆栈有关系。。。。。。: h, t3 C R. ]9 \& l
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....( V4 J) l9 J3 f! w# B& |
0 l+ V& c0 @6 k; i1 l* e/ d" ?
4 F4 g/ I+ C8 L/ \
7 C8 L. B8 W+ _: r R: c我也很绝望啊,希望大神能帮帮忙,感激不尽,!% B' q* z% |6 J! L5 h
q) D9 w1 e( f( W+ p6 q
- N) ^0 I8 g+ m3 ?8 n附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];1 J+ s1 U1 S% a, g+ P% N% V& n
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。0 B+ K* F' n# s! A/ a, B
' m6 [. h2 _: c+ z9 L# @( Rboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
: z- [$ `% g3 v6 h: q5 J const double data1000[1000]) {
w( S4 z% ^3 B9 u$ o7 x) G2 }
! p6 Q4 Y! Y: k% L9 H, b- ~' H int myfuck;
8 s4 I1 p) i3 A double yiDuanShuJu_mean;1 x' h2 h; p% T' |2 [0 ~# x. U
double yiDuanShuJu_LowMean[1000];9 p' P( \' s0 z/ M# \
int ixstart;
+ f: i: P- c& G7 I% W double dv0[1000];% Z: f: H. B$ q
comm_AGC pAGC;
' t7 F# m! Y- v0 E comm_CarrierSynchronizer pFineFreqCompensator;
% b* u: J" O9 X4 c/ o/ B; x dspcodegen_FIRDecimator pRxFilter;
; |- c, j3 q- B& N. I# M comm_SymbolSynchronizer pTimingRec;
& R( a/ d/ ?# F- a* w2 q comm_PreambleDetector pPrbDet;
( L% V ?5 l& g8 W* D; \! s9 @) B FrameSynchronizer pFrameSync;- H7 e3 i* }- Y
QPSKDataDecoder pDataDecod;
9 @/ P3 R$ \( K" i# u P$ N4 Z k static double usable_left_filtfilt[81000];
7 r3 j% b8 F: n5 t static double youXiaoShuJu_QuZhiLiu[81000];
" a' B! y. J$ R. e2 y double mtmp;
0 S' Q; i, g! d9 s: h! {2 J int ix;" q. L' u$ s) H- b. }
boolean_T exitg2;
& V p0 F& w: @" s/ h boolean_T exitg1;7 `* f+ o. H7 [7 Y2 I# s, E
double YiZhenShuJu[800];
1 w, U9 }+ }* `7 C: h7 w3 h double dv1[800];9 [& [$ f+ H: L1 n/ I' R
. Y: i' K, M9 p8 G* _
5 R1 V3 N# f6 @* i double b_YiZhenShuJu[800];
4 Z5 G6 k- E# N- W1 X9 ~4 O double I_filtfilt[800];. L& o' C5 m4 e2 _/ o- s' s
double Q_filtfilt[800];
6 Q n1 b9 j4 Y& k% P7 ~" ?% b creal_T b_I_filtfilt[800];
8 Y# B1 }6 L- l; H3 _$ P" m+ x# \ creal_T b[800];! o' E9 h: q0 Y8 Z- w/ z# b+ `' f
creal_T RCRxSignal[50];
9 ?& E. `; `5 G; l creal_T fineCompSignal[50];
. f8 a: l4 s* F1 T7 s double phError[50];# x$ h" N. d D+ L$ d. L3 u
creal_T timingRecSignal_data[28];& v7 U4 `, {2 i1 r: ~/ t
int timingRecSignal_size[1];7 E# b5 H9 j4 F/ ]* X0 m3 F' x
double prbIdx_data[28];
! q3 C- x" g4 J$ l6 I# U) b: z6 c( X int prbIdx_size[1];! b: o/ J4 h3 B1 D& X+ w C
double dtMt_data[28];
. v, ?6 r4 ^* n0 c4 S int dtMt_size[1];
2 V5 m$ n8 g9 t6 o creal_T symFrame[25];
. o5 u2 A+ e0 \& v boolean_T isFrameValid;
# }: s6 p6 }6 P; ?" H8 M double unusedU0[3];
! w. B8 H& T! s% v! V* d X. B( X! n' Z" x, X5 V: p5 o
//调试过程中的变量
4 I8 j* I7 D9 ~! D2 F8 |; [ int enough_data;
) D1 N% k, s- R2 Y+ d# {! T
2 r5 [% ?- V' |& t int enoughDataFlag;
+ Y3 p8 l6 U! x int yiDuanShuJu_mean_int;
/ a& v8 w" e$ j% f& n int int_sum_dv0;
8 J* J; _1 j' w7 R" U s/ z int oo;* z8 N- r% h9 E5 N+ [4 F
int ii;
4 z; Z ]+ V' k4 r myfuck=10;7 p. D8 `6 a- W9 ?$ C
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
4 d+ P+ s4 f4 t /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */' ~+ S5 T7 ]2 J8 H2 o
E: ]: A* h7 a4 |/ w yiDuanShuJu_mean = mean(data1000);* _% W0 p. \1 m
- o4 G. g' _3 w8 W4 y) h8 }# [' q yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
$ l: F8 b# B: M" Y# ?# @ UARTPutc('A');! A; A# ^5 }' m
UARTPutNum(yiDuanShuJu_mean_int);
5 W7 n+ F: }$ q$ ~/ e' E UARTPutc('\r');
: ?) V2 O/ n2 F5 W. ?7 C UARTPutc('\n');* }+ t- F5 M1 ^* Z- o
4 I5 n3 C$ C" M4 | M for (ixstart = 0; ixstart < 1000; ixstart++) {
; v, `: i) M) s+ Y0 S% x yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
2 z- l" `$ W8 I% O }' X, j+ R" s- d4 ?0 O9 K1 s# G% A
' n3 X9 Q& g' B6 P( ]* d) X power(yiDuanShuJu_LowMean, dv0);5 z k# H/ X, |0 h# H4 O0 v
; n/ M( t3 O; W8 ]0 O* A int_sum_dv0 = (int) sum(dv0);
" m. N' s+ S4 N- ?! \, L6 z k! J/ T
UARTPutc('B');
4 H) x# _% H9 G7 U UARTPutNum(int_sum_dv0);
$ V! S/ K# v6 \/ u+ e4 b+ p$ t UARTPutc('\r');' M5 I/ V/ U/ o! Y$ N
UARTPutc('\n');. w: y; w) J% z, g$ z5 V8 l3 s3 Y
; R- [. P& c7 Y p
// int compareFlag = int_sum_dv0 > 1.0E+8;
. E( X" X; k7 ~6 f5 l# r& H+ i# I9 x4 l: m& q# p+ b& D: D
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?4 K* C. F1 d2 ?( f
UARTPutc('C');2 p- N# v. W6 M/ ?0 E
/* 比较信号能量 */
! H4 D! L4 |& S5 [ /* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */& e) e& O0 i0 q5 L. s" j& \
// yiDuanShuJu_mean = 1000.0 * youxiao_k;
. k2 q5 _& C7 b% z1 s1 i6 n// for (ixstart = 0; ixstart < 1000; ixstart++) {
, A5 P2 n( h& G! a, j3 F S// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =# I& O g6 Q/ c- P0 X" x Z
// yiDuanShuJu_LowMean[ixstart];
: b- y$ x6 n3 P3 F1 L, I// }
5 J+ ?" N2 m3 ~5 I+ S/ F; ?4 V//: O' _. q, L5 o: J: U7 `
// youxiao_k++;
7 i. p9 _9 U' h @// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==! |4 x' W9 T1 I" k
// /* 感觉要取21个数,即0-20, */
0 k7 y% F& I" G. n// enough_data = 10;//有效是10,无效是0: W( B a) R. j1 m8 J3 y" g
// }: [9 u d1 Z5 W6 `# N& w
}$ Z; @- a- k9 S! R4 d/ Q9 g
$ t, u4 H' N) z! A7 [2 G3 V8 M% U
. r, }, J. z* q4 g# z3 i enoughDataFlag = 100;! x+ N, o5 O, |. `9 ?
enoughDataFlag = 1000;' ? ?9 v4 c9 }% K$ @% R2 e* ^
enoughDataFlag = 0x02;7 A8 m' |9 |4 R% ~ k2 M; t6 f
enoughDataFlag = 200; d# w* R- d0 g B# O
9 [4 r! P b# F0 X5 i/ W
int myfuvk1;* s4 n& ]9 y/ a. u8 Z# Z( C
myfuvk1 =11;
8 {- K2 O# q5 U! `5 M; y5 W1 l
: w8 W7 p- V/ s& x+ {2 M5 J I. S x- y( r# t* [
enough_data = 0;# a3 s+ U1 J0 X1 }
5 o# Q6 U/ f) k! K" s& w9 J. k
// if(enough_data>50){
# R3 E8 K1 t/ w- @" i; j) J' ~9 l// enoughDataFlag=0x01;/ }9 ^* {/ C% u3 P4 q, j) Y- D$ j
// }else if(enough_data<50){
' `1 N4 d2 G- a( I. j$ f: D// enoughDataFlag=0x00;//0x00还是不行
, v- c0 H8 F- Q0 W// }
9 Q/ r4 i7 F; ]/ D6 L* X, u- ~- H2 I1 }
4 o5 ~& @3 L0 r6 h8 v1 F oo=10;3 S. y& ?" T, O, e4 f* U! Q
oo = oo < 5;
/ T) m A$ T3 }. [ if(oo){, w- Z G$ S; A! a1 @
ii=0;
6 u: _2 g6 W# u3 l2 I }
% ~/ L/ C. s# C) Y' [2 Y if(oo < 5){+ ^2 x, J% r+ Y. T+ F1 x
ii=0;
! ^2 T2 c$ N) ~& \8 s0 H0 }4 M# T/ g }) i7 V+ t4 p; M
if(oo > 5){
% A) i, h1 g) [8 ` ii=0;* x5 ?% G. ~' w
}
$ {; K' M6 S$ m1 G9 h! G
5 v. _) L- d9 X /* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
0 f/ x% Y! j% K& r: A /* 如果数据足够才执行主程序 */1 t& h! Q/ Y! P$ @7 x
oo = oo < 5;
2 H$ X7 Y* c. Y: @1 [5 C5 l- O# c enoughDataFlag = enoughDataFlag < 5;3 c' s6 I: _7 V0 I D7 E! L6 ^4 g
if (enoughDataFlag < 5) {% ^/ Y7 J3 \' z2 G6 l( Z9 q7 c
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0- {. `; Y1 O# T
AGC_AGC(&pAGC);0 z/ J9 X& Z9 f/ F
+ s: v( g8 `' |: ?
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);, o0 A0 [8 p3 |; I( ~
FIRDecimator_FIRDecimator(&pRxFilter);& e4 U: z$ \9 ^' g1 x4 q
/ N/ a$ A' ?0 U6 g9 L2 d9 @
/* Downsampling */' \) G1 t% G" O6 E* ~5 w
c_SymbolSynchronizer_SymbolSync(&pTimingRec);
$ Q/ n* G7 X( N
% H9 ?- R6 C9 T2 p8 L- ^& D c_PreambleDetector_PreambleDete(&pPrbDet);2 f8 h+ t2 {8 z1 ^0 H1 C. R
, l* ?& i& [6 z7 t, B+ u' e" e /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */: |7 b, K, {6 p9 l0 w
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
, f( D q+ l' A2 E /* %帧数量=100 *// y* i2 A" o* E4 d. U d( W% ?9 n
pFrameSync.isInitialized = 0;* ?, {9 K2 L" S; o& @) ^! v
1 E: n: w/ j x4 n. `1 i) z
/* [EOF] */
% U! t7 s$ c7 E. u0 [2 t /* 前导码长度是13 */
( b- i* u4 D/ X, _( z' g2 G /* %qpsk */* y, }7 p I1 V+ O
pDataDecod.isInitialized = 0;
$ o+ K: s/ Z8 Z) X p
6 f% O8 Q! x" y /* end */2 d% l; G* z- T2 P+ @
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
2 l0 ^7 z# i% P /* Convert 3-dB frequency */
% S+ q9 U: b2 h( k& }% J$ z /* Convert 3-dB frequency */
. d6 t9 n% g4 M, { filtfilt(save_buffer, usable_left_filtfilt);
' d% V' B9 o$ n7 m1 e4 F5 ? for (ixstart = 0; ixstart < 81000; ixstart++) {4 C: A6 ^9 B/ L+ p" a
usable_left_filtfilt[ixstart] *= 2.0;8 V S' m& g* d5 N0 a$ L
}
- V- D* C; n6 t* _: u- u3 C! D) s# c
& k$ z2 H2 P- Z* l1 A9 @) y: J /* 注意乘2,处理幅度 */* l' M* i* T! ^& E( @ d! ?3 y
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */
, n) \: n9 k! S$ ?- {2 U* x /* %% 行列转换 */! O2 B! ]( ?+ P
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);: q A7 K/ ]' h! w" [
for (ixstart = 0; ixstart < 81000; ixstart++) {
. q' y& k) U) G/ I4 G, n& |! [7 f6 e youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
# G0 [4 ^: u6 C" [5 g9 k5 [* X - yiDuanShuJu_mean;
8 u3 E B5 F1 K8 u* d$ V I }
" M# {' l3 U# o* w# \9 [
w+ z U$ G+ ` /* %% 应该对数据归一化,但是这一步放在哪比较好 */
; t; U/ B; J& }% {. w% j/ b O) ^ ixstart = 1;/ D$ ?" d, h* r- q
mtmp = youXiaoShuJu_QuZhiLiu[0];
; D( F$ h5 ~: T if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {& Z- ~+ \& i0 s/ z
ix = 2;1 H* s" k1 ` Z
exitg2 = false;$ p+ ?7 F4 P4 C6 O' \* R
while ((!exitg2) && (ix < 81001)) {
5 n9 `' [: H" j7 } ixstart = ix;
) W$ L/ X- y2 t, A7 c9 z" u if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
% N5 t0 y U4 K" Y0 p9 y ^7 O" B mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
j. K$ Q" \5 z% n3 B$ c$ U4 K exitg2 = true;
3 c* O0 C5 L, n. f4 N } else {
5 d, [% t$ }# w% k, Z2 w* u* D5 u ix++;
* `- V1 w1 W9 f& H m }
, c4 |9 l# L, A# B8 s8 o7 d u }8 K' |% `% O( B: _5 T$ b8 V
}
; A; ~- ]5 N& D- C v( [6 S- j# H7 ^0 Q
if (ixstart < 81000) {
( ]! j2 Y" k4 Y6 i while (ixstart + 1 < 81001) {
; r: l2 ?. O! f3 G! Y if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
7 t+ | c3 U% Q5 \1 ` mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
3 p4 E2 Y+ q1 x7 Q' J$ E F# l1 T }! [, e9 C/ F a
: h0 v2 V* {2 W, ] ixstart++;9 Z# l4 l) i" V. c- R0 G
}
; N% p. ^# P. ~, c' x9 I }# q1 g2 h2 x6 a0 x
) v: r2 Q4 ?, d/ n) @: o) N ixstart = 1;& X8 z- J# }, H" \# _
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];) V7 g0 p+ ]: |, E% y0 k% W* x3 j
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
( @2 _ q0 ?! U) o9 F% H# w ix = 2;" l( d5 x; Y3 m( s' [/ \) F
exitg1 = false;
4 f; Y7 {# M+ V, n while ((!exitg1) && (ix < 81001)) {
6 w) \9 v6 s5 i5 z ixstart = ix;
! g/ T' g% T' S$ x/ z if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {5 ]& x: K% m/ J& H. J! v
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
- Z4 Z7 d4 E/ M exitg1 = true;2 Z, Y0 G, O! N$ M% [
} else {
0 ]8 B: z+ C* y7 \ ix++;
6 ^ ]" k" h( U9 a4 e }1 `3 D; ` `0 m. \
}
5 Y+ Y& d6 a' A3 L$ K }
1 [; k6 j/ R2 c% B5 _: E; u3 a$ K0 F
if (ixstart < 81000) {" |$ H& D0 X& e0 L' c" b2 z2 E
while (ixstart + 1 < 81001) {
8 D$ G) j; T( D9 a& a if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
# e8 ^, B% j9 C( h" [1 @! j2 Q- f yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];, C, B+ K* Y7 H& I$ G
}/ k8 L* ?! e+ T' s# m6 r2 B
4 g. Q( S2 x5 q- ~7 w
ixstart++;
+ h8 o+ T8 Z x3 r. t: u }3 t0 }7 o, X) G; U
}& C" T- |: q8 i
$ O9 n. q! }" l- q9 o: t, ^ yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
; I' M$ D: j2 p0 A! Y if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {" R4 f Y% s+ [4 ~! ]
yiDuanShuJu_mean = mtmp;& H' J* a* r+ ^
}
! p5 n1 V8 f0 K: Z) c# W4 k, G/ E6 D
( J2 E9 _! d. ` /* 找出极值 */; M) Z: r4 a0 l" e- d
for (ixstart = 0; ixstart < 81000; ixstart++) {0 g! Q t4 c: b, ~0 M3 Z6 |- L7 S
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;; H+ v5 ~' `2 w: _( K7 O; i/ B
}
! @5 x: s. e8 j: f8 P5 t
* s1 F9 [; L- m7 b( ? --------------帖子字数限制------------------
; U& L7 r6 j- \) o2 E}
% x3 e- s3 S' ~0 v/ w6 T2 ^2 V) T: U, ~- x& j5 l( ?* u0 d
4 r2 K; N- D q1 i
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|