שאלה בDSP, פלטפורמה: #C

nissim tr

New member
שאלה בDSP, פלטפורמה: #C

היי אני צריך עזרה עם בניית פילטר BAND REJECT אני ושותף שלי עובדים על פרוייקט גמר לתואר הנדסאי החלטנו ללכת על משהו שעוד לא עשו כפרוייקט גמר (לפחות לא איפה שאנחנו לומדים) - סינטיסייזר אנלוגי וירטואלי הסינטי כרגע עובד כ-SAMPLE GENERATOR כלומר ברגע שישנה פקודה להפיק צליל הוא מייצר את הצליל לתוך BUFFER ואז משמיע אותו. על מבנה של סיטני אנלוגי, באופן כללי: יש יחידת אוסילטורים המכילה 2 אוסילטורים המשולבים יחד כל אחד יכול לייצר סוג גל מתוך כמה אפשריים כמו שן-משור או פולס מהאוסילטורים לאחר מכן הגל שנוצר עובד דרך פחלטרים ואז דרך מעטפת הקובעת את עוצמת הצליל לאורכו. בקיצור אנחנו רצינו לשלב 4 סוגי פילטר, LOWPASS HIGHPASS BANDPASS וBANDREJECT, מצאנו באינטרנט קוד שעם שינוי מסוים עובד כ3 הראשונים אבל לא הצלחנו להוציא ממנו BAND REJECT. אם מישהו יודע איך אני מאוד יודה לו צירפתי את הפונקציה שלנו שעושה LOWPASS ושממנה בנינו את האחרות:
private void LowPass24(Int16 []IN,Int16 []OUT, Int64 Lenght,int F,int Q, ADSR FiltADSR) { Int64 i; double b_in; double b_inSH; int b_oversample; double prevfp; double b_fp=0; double b_f = (double)F /100; double b_q= (double)Q /100*4; double s_vsbF = (double)F /100; double pole1=0; double pole2=0; double pole3=0; double pole4=0; for(i=0;i<Lenght;i++) { b_f=FiltADSR.ValueAtPozition(i)*s_vsbF; //b_f=ADSRValue(Lenght,i); // Karlsen 24dB Filter by Ove Karlsen / Synergy-7 in the year 2003. // b_f = frequency 0..1 // b_q = resonance 0..50 // b_in = input // to do bandpass, subtract poles from eachother, highpass subtract with input. b_in = Convert.ToDouble ( (double)IN/32000); b_oversample = 0; b_inSH = b_in; // before the while statement. while (b_oversample < 2) { //2x oversampling (@44.1khz) prevfp = b_fp; if (prevfp > 1) {prevfp = 1;} // Q-limiter b_fp = (b_fp * 0.418) + ((b_q * pole4) * 0.582); // dynamic feedback double intfp; intfp = (b_fp * 0.36) + (prevfp * 0.64); // feedback phase b_in = b_inSH - intfp; // inverted feedback pole1 = (b_in * b_f) + (pole1 * (1 - b_f)); // pole 1 if (pole1 > 1) {pole1 = 1;} else if (pole1 < -1) {pole1 = -1;} // pole 1 clipping pole2 = (pole1 * b_f) + (pole2 * (1 - b_f)); // pole 2 pole3 = (pole2 * b_f) + (pole3 * (1 - b_f)); // pole 3 pole4 = (pole3 * b_f) + (pole4 * (1 - b_f)); // pole 4 b_oversample++; } //pole4=b_in-pole4; //if(pole
 

nissim tr

New member
המשך קוד, נקטע לי באמצע....

OUT = Convert.ToInt16((pole4)*32000); } }
 

gabizi

New member
שלום

כמה דברים : תסביר מה זה REJECT BAND , האם זה לא מעביר כלום או רק חלק , ואם כן איזה חלק ? דבר שני הקוד בכלל לא ברור . תעביר אותו לשמות משתנים עם משמעות תוסיף הערה על כול שורה מה היא עושה ( רצוי בעברית ) למשל תכניס את זה לקובץ DOC ותצרף לתגובה , לא ברור לי בכלל מהקוד איך הוא מסנן תדרים נמוכים ולא ברור לי מה זה ה REJECT הזה אני מבטיח לקרוא ולנסות להבין
 
למעלה