DIY digital filter, tại sao không? (updated 16/4/09)

Discussion in 'Thiết bị số' started by risc, 15/3/09.

  1. risc

    risc Advanced Member

    Joined:
    27/12/06
    Messages:
    112
    Likes Received:
    0
    Mình sử dụng hàm fdesign.lowpass(Fpass,Fstop,Apass,Astop) để mô phỏng filter ở tầng thứ 1, dùng hàm firhalfband cho tầng thứ 2 và 3. Còn việc implement trên FPGA thì mình tự viết VHDL code cho tất cả các module, ngoại trừ async FIFO cho ngõ vào và ngõ ra thì sử dụng thư viện có sẵn của Altera.
     
  2. risc

    risc Advanced Member

    Joined:
    27/12/06
    Messages:
    112
    Likes Received:
    0
    Theo em nghĩ bác ko nhất thiết phải dùng nhiều RAM như thế. Bác có thể sử dụng cơ chế double buffer, 1 buffer đang dựoc xử lý còn buffer kia dùng để xuất ra DA, vai trò của 2 buffers này được hoán đổi liện tục (người ta còn gọi là ping-pong buffer). Nếu cần thiết bác có thể dùng dến tripple hoặc quad buffer.
     
  3. bocaungongac

    bocaungongac Advanced Member

    Joined:
    31/3/09
    Messages:
    292
    Likes Received:
    1
    Location:
    HCM

    Theo em nghĩ thì không tốn RAM nhiều đến thế đâu ạ (vì tín hiệu sẽ tuần tự khi đã đẩy hết dữ liệu đầu thì RAM được giải phóng và dành cho dữ liệu tiếp , nếu mà MPU cần nhiều RAM để xử lý như vậy thì nó làm việc như nhận hết DATA mới xử lý thì delay mất 5' 1 bài hát thông thường mất , theo em thì bác ấy định làm như RAM trên card VGA ấy ạ ) vấn đề là RAM tốc độ cao , còn nếu làm trên FGA có nhiều lợi điểm như xử lý song song thì nếu thực hiện và chương trình ổn thì là việc khá hay , các bác nhiều kinh nghiệm xin chia sẻ với nhau để mọi người DIY có sản phẩm tốt ngoài hãng chuyên ạ[/quote]

    Ý của em cũng là dùng 1 lượng RAM nhỏ hơn dung lượng 1 bài rồi chia thành nhiều vùng để ping-pong chứ ko thể nào đệm hết 1 bài được vì vừa tốn RAM vừa mất thời gian lâu, nhất là chưa nghe lại muốn chuyển bài thì tốn thêm 5', chuyển vài lần ... là ngủ luôn, khỏi nghe, hihi.
    Theo tính toán của e, với fs=44,1Khz thì thời gian để chuyển hết 1 sample là ~160ns*16. Trong lúc này, MPC làm 3 việc, vừa nhận, vừa xử lý, vừa gửi dữ liệu ra. Nếu dùng RAM thì thêm việc đọc và ghi RAM nữa... CPU hơi mệt đó.
     
  4. bocaungongac

    bocaungongac Advanced Member

    Joined:
    31/3/09
    Messages:
    292
    Likes Received:
    1
    Location:
    HCM
    Sẳn đây Bác cho em hỏi lun là sau khi shift xong 1 sample, bác đệm lại bao nhiêu sample trước khi xử lý rồi shift ra DAC.
     
  5. risc

    risc Advanced Member

    Joined:
    27/12/06
    Messages:
    112
    Likes Received:
    0

    Async FIFO mà em đề ở trên dủng để đồng bộ audio sample rate 44.1 Khz từ chip CS8416 với FPGA clock 50 MHz trong module ser2par, vì vậy sample rate của tín hiệu bên trong FPGA rất cao, nhanh hơn rất nhiều so vói audio sample rate 44.1 KHz, vì vậy việc xử lý được thực hiện liện tục khi có data ngõ vào mà ko cấn sử dụng đến cơ chế buffer. Sau khi xử lý xong, tin hiệu được đồng bộ lại @ 88.2 hoặc 176.4 hoặc 352.8 KHz bằng async FIFO khác, đồng thời chuyển sang serial bit stream tương thích với DAC trong module par2ser.
     
  6. dinhthuy

    dinhthuy Advanced Member

    Joined:
    20/5/08
    Messages:
    706
    Likes Received:
    6
    .......
    Async FIFO mà em đề ở trên dủng để đồng bộ audio sample rate 44.1 Khz từ chip CS8416 với FPGA clock 50 MHz trong module ser2par, vì vậy sample rate của tín hiệu bên trong FPGA rất cao, nhanh hơn rất nhiều so vói audio sample rate 44.1 KHz, vì vậy việc xử lý được thực hiện liện tục khi có data ngõ vào mà ko cấn sử dụng đến cơ chế buffer. Sau khi xử lý xong, tin hiệu được đồng bộ lại @ 88.2 hoặc 176.4 hoặc 352.8 KHz bằng async FIFO khác, đồng thời chuyển sang serial bit stream tương thích với DAC trong module par2ser.[/quote]


    Bác không sửa lỗi bit nhỉ ? (em đùa chút như thế nó thành DSP rồi mất) cách làm của bác rất hay có độ trễ rất thấp , nhưng các mode đồng bộ data out chắc bác cho người dùng select được chứ ạ .
     
  7. dig_media

    dig_media Approved Member

    Joined:
    23/4/09
    Messages:
    19
    Likes Received:
    0
    Cám ơn bác dinhthuy, đúng là không cần dùng RAM lớn lắm, vì không dùng để chứa hết data của một CD, vì phải xử lý realtime. Nếu để load hết 1CD, hoặc là 1 bài hát vào xong, mới xuất ra, thì phải ngồi chờ rất lâu mới nghe được 1 bài hát, như vậy sẽ không thực tế. Vấn đề lớn có thể gặp phải đó là tốc độ của MPC. Em sẽ cố gắng tính toán, sớm đưa ra giải pháp và nhờ các bác cho ý kiến. Rất cám ơn ý kiến đóng góp của các bác.
     
  8. bocaungongac

    bocaungongac Advanced Member

    Joined:
    31/3/09
    Messages:
    292
    Likes Received:
    1
    Location:
    HCM
    Dạ, em hiểu ý bác. Ý em muốn hỏi là trong phần xử lý upsampling và lọc... bác dùng mấy sample cho 1 lần hay nhận được sample nào xào luôn sample đó, hihi.
     
  9. risc

    risc Advanced Member

    Joined:
    27/12/06
    Messages:
    112
    Likes Received:
    0
    Đúng roài bác, nhận được sample nào là em xào nó luôn.
     
  10. risc

    risc Advanced Member

    Joined:
    27/12/06
    Messages:
    112
    Likes Received:
    0

    Bác không sửa lỗi bit nhỉ ? (em đùa chút như thế nó thành DSP rồi mất) cách làm của bác rất hay có độ trễ rất thấp , nhưng các mode đồng bộ data out chắc bác cho người dùng select được chứ ạ .[/quote]

    Được chứ bác ạ, người dùng chọn qua 2-bit bus outmux (dùng 2 dip switch). Bác xem ở đây
    http://vnav.vn/forum/download/file.php?id=93116

    Ngoài ra còn có thể chọn output data là 16, 18,20 hay 24-bit qua bus 2-bit outwidth
     
  11. bocaungongac

    bocaungongac Advanced Member

    Joined:
    31/3/09
    Messages:
    292
    Likes Received:
    1
    Location:
    HCM
    Vậy khi bác upsampling, làm sao bác tính được giá trị biên độ giữa 2 lần lấy mẫu. Nghe nói là muốn up lên 4x thì bác phải tính được thêm 2 giá trị để đưa vào khoảng giữa 2 sample đúng ko bác?
     
  12. risc

    risc Advanced Member

    Joined:
    27/12/06
    Messages:
    112
    Likes Received:
    0
    Vậy khi bác upsampling, làm sao bác tính được giá trị biên độ giữa 2 lần lấy mẫu. Nghe nói là muốn up lên 4x thì bác phải tính được thêm 2 giá trị để đưa vào khoảng giữa 2 sample đúng ko bác?[/quote]

    Thực chất upsampling gồm có 2 quá trình là chèn giá trị zero giữa các sample và filtering, vd: 2x upsampling sẽ chèn 1 zeros giửa 2 samples liên tiếp rồi tiến hành thực hiện lọc để loại bỏ replica spectra do quá trình chèn zero tạo ra.
    Code:
    %zero insert
    s1 = upsample(x,2);
    %replica spectra filtering
    x1 = filter(h1,1,s1);
    
    Khi đó ngõ ra x1 sẽ có data rate nhanh gấp 2 lần so với x, 1 input sample sẽ cho ra 1 output sample.
    Tuy nhiên, trong thực tế, không ai làm như thế này vì việc filter sample co giá trị zero là vô nghĩa, ngừoi ta sẽ dùng giải pháp polyphase filter. Nó ra thì dài dòng lắm, đại loại là nó chia thành nhiều bank (2 bank ở vd trên) rồi thực hiện filtering vói input là x, khi đó ngõ ra sẽ là s1 và s2 chẳng hạn, sau đó output sample sẽ đuơc sắp xếp tuần tự như sau x1 = s1s2s1s2 .....
    Đây là 1 vd khác trong sách Multirate signal processing

    Bác tìm đọc thêm trong các sách về xử lý tín hiệu số sẽ rõ hơn.
     
  13. bocaungongac

    bocaungongac Advanced Member

    Joined:
    31/3/09
    Messages:
    292
    Likes Received:
    1
    Location:
    HCM
    Bác có thể nói rõ hơn về mối liên hệ giữa mô phỏng trên Matlab và việc thực hiện trên FPGA. Việc mô phỏng sẽ đem lại lợi ích gì cho bác khi làm thực tế?
     
  14. risc

    risc Advanced Member

    Joined:
    27/12/06
    Messages:
    112
    Likes Received:
    0
    Cái này cũng dễ hiểu mà bác, nếu bác làm mô phỏng trên Matlab chạy đúng thì việc làm trên FPGA chắc chắn sẽ được. Còn nếu làm trên matlab chưa đưoc thì ko nên làm trên FPGA ngay vì sẽ mất rất nhiều thời gian, thậm chí ko làm được nũa.
     
  15. bocaungongac

    bocaungongac Advanced Member

    Joined:
    31/3/09
    Messages:
    292
    Likes Received:
    1
    Location:
    HCM
    Dạ, đó là ý nghĩa của việc mô phỏng, e hiễu. Ý e muốn hỏi bác là khi dùng Matlab để mô phỏng, bác có được các thông số để làm thực ko? Nếu ko, thì để làm cho kết quả FPGA giống với mô phỏng, bác sẽ làm cách nào? Vì dường như các hàm của Matlab ko trả về các thông số của mạch lọc.
     
  16. bocaungongac

    bocaungongac Advanced Member

    Joined:
    31/3/09
    Messages:
    292
    Likes Received:
    1
    Location:
    HCM
     
  17. risc

    risc Advanced Member

    Joined:
    27/12/06
    Messages:
    112
    Likes Received:
    0
    Thế này nhé, giả sử x = [x0 x1 x2] tương ứng thời gian la t = [t0 t0+delta t0 + 2delta], khi thêm zero sẽ là
    s1 = [x0 0 x1 0 x2], trục thời gian tương ứng là t1 = [t0 t0+delta/2 t0+delta t0+3delta/2 t0+ 2delta] (2x upsampling), bác sẽ thấy trong cùng khoảng thời gian [t0 t0+2delta] s1 có sample rate gấp 2 lần x. Tiếp theo là thực hiện filter với đầu vào là s1@ 2x sample rate, đầu ra la x1@2x sample rate để loại bỏ replica spectra do quá trình upsampling tạo ra. Hiển nhiên là các giá trị tại vi trí zero của s1 sẽ đựoc nội suy tại ngỏ ra x1.
     
  18. bocaungongac

    bocaungongac Advanced Member

    Joined:
    31/3/09
    Messages:
    292
    Likes Received:
    1
    Location:
    HCM
    Cảm ơn bác đã tận tình chỉ bảo.
    Theo như bác nói, e có làm thử như sau:
    1. Tạo x=sin(2*pi*t)
    2. Upsampling 2x
    3. Tao cửa sổ lọc
    4. Lọc
    Sau khi chạy cho kết quả như sau:
    Đường thứ 1 là tín hiệu nguyên thủy.
    thứ 2 là sau khi upsampling.
    thứ 3 là sau khi lọc.

    Như vậy, thì tín hiệu đã bị lăn tăn do quá trình upsampling bằng zeros?
     
  19. risc

    risc Advanced Member

    Joined:
    27/12/06
    Messages:
    112
    Likes Received:
    0
    Bác có thể nói rõ phần filter bác design như thế nào? Nhìn trên hình kết quả của bác chắc là có sai sót ở đâu rồi. Kết quả ít ra nó phải như thế lày lày:
     
  20. bocaungongac

    bocaungongac Advanced Member

    Joined:
    31/3/09
    Messages:
    292
    Likes Received:
    1
    Location:
    HCM
    E làm như em đã nói ở trên đó ạ.
    1. Tạo tín hiệu sin
    Code:
    t=0:1:20;
    x=sin(2*pi*t/20);
    2. Upsampling
    Code:
    x2 = upsample(x,2);
    3. Lọc
    Code:
    s = filter(h1,1,x2);
    Mong bác chỉ giáo thêm phần thiết kế mạch lọc ạ.
     
  21. risc

    risc Advanced Member

    Joined:
    27/12/06
    Messages:
    112
    Likes Received:
    0
    Ý em nói là bác thiết kế thông số để tính ra filter coefficient h1 như thế nào? Bác phải nói rõ thì em mới giúp đưoc5 cho bác chứ.
     
  22. dig_media

    dig_media Approved Member

    Joined:
    23/4/09
    Messages:
    19
    Likes Received:
    0
    Thấy bác bocaungongac và bác RISC bàn luận làm em rối quá! Theo em biết, kết quả mô phỏng trên matlab, và thực thi trên FPGA có thể khác nhau. Vì trên matlab, các biến ở dạng floating point, trong khi đó, trên FPGA chỉ có thể dùng ở dạng fix point. Vậy thì sự khác biệt này có làm ảnh hưởng đến chất lượng mạch lọc không ạ? Ngoài ra, nghe nói có tool DSP builder (Altera) hoặc System Generator, Accel DSP (Xilinx) có thể generate từ các hàm matlab sang code VHDL hoặc Verilog luôn. Nếu dùng mấy tool này thì có thể sẽ ít tốn thời gian hơn không ạ? Trong trường hợp mình tự thiết kế VHDL và dùng tool để built thì cái nào sẽ tốt hơn? Em thấy sao dùng FPGA phức tạp quá, em vẫn thích dùng microprocessor, nhưng e rằng khó đảm bảo được tốc độ. À bác RISC ơi, bác dùng hàm mạch lọc gì mà trông tín hiệu ra tốt thế, không biết có phức tạp quá không nhỉ! Không biết liệu em có thể thực thi trên MPC được không nhỉ Mong các bác cho ý kiến nhé! Cám ơn rất nhiều.
     
  23. risc

    risc Advanced Member

    Joined:
    27/12/06
    Messages:
    112
    Likes Received:
    0
    Thực ra bác có thể mô phỏng fixed-point trong Matlab cũng được, bác chịu khó đọc help phần fixed-point tool box, còn nếu ko thích thì bác có thể tự chuyển đổ từ floating point sang fixed point rồi mô phỏng bình thường. Tùy theo yêu cầu độ chính xác của xừ lý tín hiệu dựa trên fixed-point mà bác phải ước tính cần bao nhiêu bit để biểu diễn một giá trị, thông thường từ 16 đến 24 bit là phù hợp. Các tool chuyển từ matlab code sang FPGA có ưu điểm là tiết kiệm thời gian nhưng code sinh ra ko tối ưu, chỉ thích hơp cho mục đích thử nghiệm. Theo ý kiến cá nhân của em thì tự viết bằng VHDL hay Verilog ko những giúp bác có thể hiểu rõ kiến trúc mạch lọc rõ ràng hơn mà còn có khả năng tối ưu tốc độ triệt để. Mạch lọc ở trên sử dụng lowpass FIR filter 154 taps, do nó đối xưng nên số tap hiệu dụng chỉ là 77 taps mà thôi.
     
  24. dinhthuy

    dinhthuy Advanced Member

    Joined:
    20/5/08
    Messages:
    706
    Likes Received:
    6

    Hay bác thử tham gia họ EPGA xem , bác đã thạo trên MCU thì em nghĩ chắc bác cũng dễ bước sang lại nắm thêm nhiều vấn đề , về sử lý tín hiệu cần realtime mà dùng MCU thông thường cũng hơi kẹt vì sử lý nối tiếp cần F cao và cần thêm RAM đệm lại còn tốc độ read write nữa bất kì CPU nào cũng chỉ có 1 đường R&W nên em thấy cũng hơi bất tiện 1 chút , hoặc nếu có điều kiện bác thử cả 2 xem hì .
     
  25. dinhthuy

    dinhthuy Advanced Member

    Joined:
    20/5/08
    Messages:
    706
    Likes Received:
    6
    Bác risc có viết xong trương trình và chạy thử chưa ạ ?
     

Share This Page

Loading...