|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
b5 \ S6 h: k( t% m6 p- e$ C0 \1 _ x9 C' K4 Z$ J7 L; \/ n
各位大神:
4 F( h. H9 k" s$ N" n: h' a 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
- q3 j2 X |* E5 \ 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
, y$ B4 ^2 Q. o! m
7 @& q$ d2 \' h8 P7 s1 |/ Y8 w , h; u8 J2 h2 m+ [
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
, K! {3 B: M1 U) [$ H# C7 |0 @3 F( ]5 \; m/ ]& u3 V
并没有其他线程
* M, D2 i# ~7 ~4 ?% k1 |% E反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
" d& D% ? m/ k$ @! w也说不定是和堆栈有关系。。。。。。' L0 }4 P2 H. ]6 F) [6 ]# ^% _0 l" @
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....# B8 B3 [+ k2 z. f7 O
9 C4 M1 g+ e3 z9 A/ }# x( p
' a4 g. T3 A) u j j( X* ?! P' ^/ ?) A
我也很绝望啊,希望大神能帮帮忙,感激不尽,!
: I. n Q6 D3 o, D6 l9 m- L: j, F# {/ L# D
* D& s/ |" i9 Z1 B附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];) o( u, S3 f" l1 e& }/ j2 J
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
9 \4 ~. S4 n! V/ j# N# z: Q7 `+ J* d2 {
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(( u" F5 P) M% g% c: Q
const double data1000[1000]) {( P& a) K: Q9 C, X8 T+ Q, C6 |3 b( s- g
: B( P6 i6 z$ K: L5 t9 N( w X
int myfuck;
" N3 B/ i, U r6 O+ W5 c; n double yiDuanShuJu_mean;) P# ^8 \7 _4 [. }
double yiDuanShuJu_LowMean[1000];
$ T$ W6 q m* Y0 F int ixstart;. G. f. _7 l7 O
double dv0[1000];
5 B3 s1 y; ~$ c0 E V1 o+ k comm_AGC pAGC;
. `6 ]# Q- B2 f3 c comm_CarrierSynchronizer pFineFreqCompensator;
/ P4 t9 I5 c, a( ~% P! Z F dspcodegen_FIRDecimator pRxFilter;+ \6 ]( b4 n4 e
comm_SymbolSynchronizer pTimingRec;0 n/ r; g/ M5 B D
comm_PreambleDetector pPrbDet;
. k0 t9 o# v$ v2 F2 f FrameSynchronizer pFrameSync;5 E7 s5 b! C) g6 a- V" y8 C# ^
QPSKDataDecoder pDataDecod;1 h. S- ^" M) Y# Z2 }1 i
static double usable_left_filtfilt[81000];3 }$ F) Y# x% V
static double youXiaoShuJu_QuZhiLiu[81000];
9 B# l' |3 D: E { double mtmp;; Q6 |8 w4 r1 I9 K9 `
int ix;
; C5 Y( N* Q; f4 C7 o. _; r boolean_T exitg2;) _& x; ~0 ]5 z8 F0 `9 q
boolean_T exitg1;
6 i, C H2 q9 U1 W4 _- z double YiZhenShuJu[800];/ `1 g: v3 v4 o3 {" {, L3 Q
double dv1[800];
$ z, \% l( B( y( g: J
! q+ X0 q' z$ _/ s$ C+ q
& Q4 {, ^( k6 s" ]9 W( }: t0 e double b_YiZhenShuJu[800];
2 V$ ]: F: s, f' Y+ q double I_filtfilt[800];
& U# G( _; B) ~/ R1 O double Q_filtfilt[800];
/ D$ @! v8 }/ |3 H creal_T b_I_filtfilt[800];& j0 Y+ \- P) {( x
creal_T b[800];
B; a8 G3 q( x creal_T RCRxSignal[50];0 W5 z8 W5 |; w& Z
creal_T fineCompSignal[50];
/ ^% Y u5 r% s double phError[50];
# i; Q1 t: e8 G: s5 I4 u1 i! S- O creal_T timingRecSignal_data[28];- n1 ?6 v: F6 ? h( H
int timingRecSignal_size[1];
' p& n, F7 \5 q$ e% u' ? double prbIdx_data[28];
4 @9 P5 W1 Y! Q0 X int prbIdx_size[1];% ^8 S. e- B3 O, G0 Z: ?9 X
double dtMt_data[28];0 V& j2 ~! Y5 X. j0 v
int dtMt_size[1];7 U \. [% {- p9 |4 d
creal_T symFrame[25];1 F8 J7 R( {* m3 y( T& m1 @
boolean_T isFrameValid;
% U; ~" I2 K" S% P, ? double unusedU0[3];" \3 A4 P8 \: j* ?$ R+ H N" m
1 s/ ~. r4 \+ D
//调试过程中的变量
" \* ]- K* c! Q4 G int enough_data;7 p/ C' j" q/ u5 u' v! V- A
/ R7 S% q# H! A
int enoughDataFlag;
9 l/ S/ B4 i% Q% | c" Q int yiDuanShuJu_mean_int;5 d9 F- s5 o+ \2 ]1 ^9 H1 \' S
int int_sum_dv0;' ?, l' g0 N5 c9 b$ [" T8 e/ h( i
int oo;
) C1 e9 G' p+ x1 \, [- X int ii;1 k, ^( q8 |/ t7 a+ e/ }! |# t
myfuck=10;+ N: T& ?; a& u) V& }% o; n
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
6 q- j, R; r' X$ X3 m$ j) O% g8 N /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
$ O F9 O: x+ C0 S2 ]
1 j {2 @; k* k8 y, @1 H4 N yiDuanShuJu_mean = mean(data1000);
5 {) v" u+ [# v# e+ k# S1 {0 `5 j2 b( D( b& B6 ?* k
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
# {# V1 f, O M+ X% ` UARTPutc('A');
' H9 F# o: a' m8 D$ d UARTPutNum(yiDuanShuJu_mean_int);
+ n, K- b x1 F2 I" H! y% f: { UARTPutc('\r');
+ O& V* w7 n; }2 x; b# S0 O) g UARTPutc('\n');; k) j6 e* J3 Y2 D p2 A
- d8 z! m0 I7 Q; P% {) }1 p. |
for (ixstart = 0; ixstart < 1000; ixstart++) {
! d7 n: X3 X! L9 b7 D+ b4 K* F; x, G yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean; e% |3 J$ R1 A1 Q
}
6 K- D5 D; T* W& V/ D/ y
0 Q1 i2 P4 T8 h power(yiDuanShuJu_LowMean, dv0);
2 h, j/ w8 o; D' G# k/ r( H6 C9 K. F+ x
; D# D+ z9 X5 X6 M. S3 e7 z Q int_sum_dv0 = (int) sum(dv0);
: `) o' G+ l. b/ n' {# y) `. ^
8 Q. s; ?" T) o UARTPutc('B');7 r6 e# j2 f2 d9 X" s6 K$ }
UARTPutNum(int_sum_dv0);
: W6 x9 L& c$ D& n6 d- j UARTPutc('\r');
) ~! s& N$ Y/ f& x* s3 M" ]. @! D UARTPutc('\n');' G; k5 F5 r# ~
) F. n7 h& o0 I// int compareFlag = int_sum_dv0 > 1.0E+8;
" P8 ^2 A" L" B% [* b9 v, M* a$ z! s) E5 d& f
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?( P) ]3 H& {: H1 d
UARTPutc('C');
& U0 y8 F# g+ ?& Q( M /* 比较信号能量 */
5 s& ]" m5 ~4 i /* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
. V$ L4 k3 Y3 e! [5 D// yiDuanShuJu_mean = 1000.0 * youxiao_k;
/ C, S( D- Y! c, ]: ?/ G9 q// for (ixstart = 0; ixstart < 1000; ixstart++) {' S9 V& X! M; P' ]% |- v$ R$ u6 h
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
7 B& d! h Q" k8 k0 S" {// yiDuanShuJu_LowMean[ixstart];
% }- @" y+ h" K3 s// }
, _; }0 n* n# _# o//
. e; {1 W2 S' y// youxiao_k++;
7 \& z" \$ }9 O! U6 s- Z+ n// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
% w( N# W; J+ B8 G% {0 [// /* 感觉要取21个数,即0-20, */
! @* v1 @" u+ g# J3 p/ O// enough_data = 10;//有效是10,无效是0
) Z: e) [/ n4 V: U1 h s4 y1 Z// }: l% _7 i; I: o! ~, b3 W; a
}
2 ?6 [/ {+ e0 @! O
! X/ S$ f& s6 P- \8 W- j5 O# |; k6 C4 K; C" j. D
enoughDataFlag = 100;
( o* T+ L G/ H4 w) o2 W. S enoughDataFlag = 1000;+ F8 b% s# @: D x
enoughDataFlag = 0x02;
# x# } d3 B# e% h, S' h# r& p/ e7 H enoughDataFlag = 200;
& ]# j/ H. ?0 m! X7 J0 ~# V; n
, b; k% B3 j) H4 ]0 R9 D int myfuvk1;
- v5 o" j8 U* C: w6 G) E" L$ p myfuvk1 =11;
5 i k' l( d# `5 `6 t5 A( [" S4 B
/ W/ q; n# S$ Q8 M
/ `- d& S/ v( l# }: _) ? enough_data = 0;
" L8 _% ^7 x# x, B+ n
9 s, \! e7 M2 K T4 O# n// if(enough_data>50){
; b+ \6 Y' n; {- p: L4 ^* k& `0 O// enoughDataFlag=0x01;5 Y$ X: ?) g# e8 Y q
// }else if(enough_data<50){
; o% {2 R* u1 g2 t/ i// enoughDataFlag=0x00;//0x00还是不行/ j- t$ n( J! ?& c% ]% N$ \" R
// }5 C! W0 h( E* H; n
" h% O& i) X2 e# O7 ?( v$ E6 `9 r+ C& f4 @; _- h
oo=10;
$ @7 ~( U: h9 E% N+ K* J. ?5 R oo = oo < 5;
( k2 K6 P8 M( j; L. C if(oo){
5 f. w- n9 }( ^/ i% o$ [0 ~ v _ ii=0;" o( L6 C. m- P9 G7 p
}
" `; |7 t- w. E: i if(oo < 5){6 ^3 U* E: O+ g: f" R0 E! Z: v
ii=0;+ c; a/ k8 {' b- G' ~" h0 c1 \3 Q
}# r! ?: F6 P! N/ W* p
if(oo > 5){
6 _7 i q( f! F9 V! b' J/ a, x3 K ii=0;1 q/ O* k/ `2 ]) W
}
8 o6 x4 i+ M0 B7 o7 M" g) @, K+ C: P) I
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
) G2 E7 }$ ]+ R) F$ K. U' N /* 如果数据足够才执行主程序 */
3 q; o- }' r$ K; z) p7 J oo = oo < 5;
) t# W! q+ r! t enoughDataFlag = enoughDataFlag < 5;
6 D6 F" [, n6 m: L; r; V if (enoughDataFlag < 5) {5 I7 G: W) r4 U$ c/ r( h
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是01 P1 n( R- f' E/ [
AGC_AGC(&pAGC);) j$ p. n* K) X5 R" X5 Y0 g
8 N, }( B5 z5 d {; w, c
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
$ O9 ] A$ i* c5 Q2 U4 n; c+ J FIRDecimator_FIRDecimator(&pRxFilter);
9 m# n+ \, }7 Y/ {7 e5 }! m% z! C" ~9 v' m9 v( [, b" D
/* Downsampling */
2 W6 Z( g3 P6 `5 S3 O0 j c_SymbolSynchronizer_SymbolSync(&pTimingRec); Z% K+ z& m! Z
+ y h, j% g: V5 _+ [ c_PreambleDetector_PreambleDete(&pPrbDet);- V/ P R Q, q+ o, L
+ o' | _ s6 w6 p/ E /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
+ H1 t5 G( q/ Y% |1 j$ J" u /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
$ B, m! _( U0 j/ U G /* %帧数量=100 */
( \% [( H. k5 V5 s5 m( |2 ? pFrameSync.isInitialized = 0;
- y [ a, L( ^
) }& y7 D8 I# h /* [EOF] */
0 |% _% `! ?+ @- U /* 前导码长度是13 */
$ S' s1 n# ]: Y; c, c /* %qpsk */ t" W& O, w) ?8 X8 ?( N
pDataDecod.isInitialized = 0;
, a7 H. a) W: A. I" S+ D# O/ \, R* V2 q. f: B7 W
/* end */
$ ^$ M! O$ a4 n6 m/ s" T /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */7 j+ z$ v6 _! `- u' R# p
/* Convert 3-dB frequency */. @6 y" ^5 {7 p& N
/* Convert 3-dB frequency */, I" T" ^, u# n. y
filtfilt(save_buffer, usable_left_filtfilt);
1 r! s+ @) ]/ n( p5 {1 r; \ for (ixstart = 0; ixstart < 81000; ixstart++) {* k9 E2 |9 e( k8 S' L
usable_left_filtfilt[ixstart] *= 2.0;. g+ k1 @. g' ?, Q& ^
}
/ C. g: j- C- V( o/ v! n
+ M# b$ C7 E: D2 g6 F /* 注意乘2,处理幅度 */( n4 a" x! H( t$ A; F; l
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */
& B' }: C$ C) `: }* i /* %% 行列转换 */
7 Z% d' q3 Q6 \' ]/ }0 o* ` yiDuanShuJu_mean = b_mean(usable_left_filtfilt);3 S. V$ T- ~0 ^0 I. c l& l3 C
for (ixstart = 0; ixstart < 81000; ixstart++) {5 s! J! T* t* L( _4 j
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
/ g: d* b6 I: w& O% b - yiDuanShuJu_mean;
' k" V/ _( y) K, O4 ?( X6 x4 Q }) [8 u* I! L8 w! L
$ J5 F$ S( b, [# v6 S
/* %% 应该对数据归一化,但是这一步放在哪比较好 */% _5 J1 `( b. z. n3 O' R
ixstart = 1;4 l6 o" X+ n6 t$ J8 }
mtmp = youXiaoShuJu_QuZhiLiu[0];$ z! g, d- u3 F9 I. M
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
/ c* l D3 [: v/ H/ w ix = 2;% a4 g$ }, b' w' P, V
exitg2 = false;* `& e4 U! q& D3 q/ r0 j
while ((!exitg2) && (ix < 81001)) {0 {" x+ I& m6 ^4 ^( C0 b
ixstart = ix;
# j. N, z! i& _* v0 n if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
9 Z0 L0 j& f$ a mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];! I n2 @# c m: Z' b) L
exitg2 = true;( l: P/ n$ e# A: u. A, }
} else {6 u: Y8 p& U0 I
ix++;8 S* e% S2 G' W- i
}# u: G+ c3 S0 b( |$ k2 x
}/ `0 g8 n/ I% ^) f9 F# h! r
}* I% a& I( i% X% a
! [. G2 M* @6 G if (ixstart < 81000) {$ L- O9 k+ M6 M3 k/ q7 Q6 ?; c/ w6 _
while (ixstart + 1 < 81001) {
- A. {* ?1 W% }2 y6 w9 v# m( o if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
* `) e, U+ s( _1 B! m- f: [8 I mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
' D( D6 n! G8 V3 _* g }
# L% m* ^ _9 O4 H( F6 L0 ^' D% e
! D. ?& O. s' j8 }& Y ixstart++;2 ^! L% C2 H" y; b* Q9 F/ n- E; q. _
}
" y+ |$ p" T+ V' T% A }* L! R F. W1 f* B, ]3 x$ @. }
( v4 D$ j$ b8 o ixstart = 1;+ H8 P* U, c/ A b
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
$ B9 j2 L; u; k# \6 e3 L x D9 \( { if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {( E( j) o3 F) z
ix = 2;4 p* m9 `. w5 z2 s
exitg1 = false;* M0 i1 ]6 A" Q. M: [% g
while ((!exitg1) && (ix < 81001)) {4 Y5 Z7 r+ n! P) b! ]
ixstart = ix;
) A3 v) I u- t" |- W h4 I% U if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
; e7 d: p5 _1 Z9 r+ o. W yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
& u, t4 k6 |+ Y. k: N* W exitg1 = true;
8 i& @8 }4 i7 f } else {
( Y1 ^/ t9 O7 N/ M! H) C/ L& W ix++;3 [: R7 X: h% f6 v+ j- \
}+ w3 j# y5 G+ g
}0 D/ n; A* d) p8 i8 A' B& r+ G
}
- ~ e% L$ N! _" e! _2 b Y/ c/ `1 U1 U) P; V) T8 s, }
if (ixstart < 81000) {: t! W% O4 R" x" _) \* e
while (ixstart + 1 < 81001) {
% q' O; O) ?+ e, I- H9 ?% U if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
$ t* S* Z# |" G2 H yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
) P9 f, ~' k7 z7 r% ^ }1 [: S! t# ]% n
; p4 `: T) t7 q9 V% f ixstart++;0 F( M0 H. Q' I) v( B
}
, l" H5 x: |0 x7 ?- u# L; y }! @: D0 E& j8 b! G
. }0 O4 [8 ~( D! L6 [$ e
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);9 U$ l9 v% R4 {$ D# j0 P
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {! b$ A" E% g. Y8 F
yiDuanShuJu_mean = mtmp;
$ \% d% G# d3 i8 G% V) H }; p5 L; s; u; ~7 u2 U) J' `. e
4 E$ T. u { r3 ` /* 找出极值 */. P. H. K+ o7 S4 O5 ^ m8 p
for (ixstart = 0; ixstart < 81000; ixstart++) {
7 @* X' S& C& y" z youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;7 z. b! c+ J% j% l0 b$ k) _' V3 c
}8 o. u- `2 O1 c/ d0 G" _/ K) ~
[- A9 z w b, j+ C$ |
--------------帖子字数限制------------------
4 k. e0 L/ G$ X/ s9 s) p5 u+ F/ Q}
/ p7 f7 Y& ~3 y% z- G: E6 r' {
- `4 e- d9 o0 J8 O% L( Y
' \; m$ ^3 D- C' c- S1 {% P |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|