Tải bản đầy đủ (.doc) (14 trang)

vẽ tín hiệu đáp ứng tần số của tuyến âm có 3 hộp cộng hưởng mắc nối tiếp

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (382.8 KB, 14 trang )

Lời nói đầu
Ngày nay với sự phát triển nhanh chóng của khoa học kỹ thuật , đặc biệt
là ngành công nghệ thông tin . Các phương tiện truyền thông đa phương
tiện phát triển càng mạnh mẽ và đóng vai đò khá quan trọng . Trong đó
xử lý tiếng nói đóng vai trò then chốt .
Bài tập lớn của nhóm chúng em là vẽ tín hiệu đáp ứng tần số của tuyến
âm có 3 hộp cộng hưởng mắc nối tiếp . Đó là 1 đề tài thật sự hữu ích
cho chúng em trong học tập cũng như cho công việc sau này . Qua đây
chúng em hiểu rõ hơn về tuyến âm và các hàm xử lý fourier .
Cuối cùng chúng em chân thành cảm ơn : Thầy giáo PGS.TS. Trịnh Văn
Loan đã tận tình hướng dẫn, giúp đỡ chúng em hoàn thành bài tập lớn
này .
Nhóm 2

1


Đề bài:
Tuyến âm được xem như các mạch côông hưởng mắc nối tiếp với nhau.
Hãy xây dựng tuyến âm gồm 3 mạch côông hưởng ở các tần số F1 =
881Hz, F2 = 1532Hz, F3 = 2476Hz. Dải thông tương ứng là B 1 = 177Hz,
B2 = 119Hz, B3 = 237Hz.
Tần số lấy mẫu là 10000Hz.
Vẽ dạng đáp ứng tần số của tuyến âm xây dựng trên.
Tần số formant, dải thông, tần số và biên đôô côông hưởng được xem là
các tham số có thể thay đổi. Vẽ lại dạng đáp ứng tần số của tuyến âm
mỗi khi thay đổi các tham số trên.

2



I.

Cơ sơ lý thuyết :

Tiếng nói là một đặc trưng chỉ có ở con người do đó để nghiên cứu về xử lý
tiếng nói trước tiên ta phải hiểu được cấu trúc vật lý của tiếng nói và cơ chế tạo
tiếng nói của con người.
Âm thanh thường được chia thành ba nhóm: âm thanh tiếng nói(voiced sounds),
âm thanh không là tiếng nói( unvoiced sounds) và các phụ âm dừng (stopconsonants). Các nguyên âm(Ví dụ như /a/,/e/,/i/) và các âm mũi(/n/, /m/...) là
âm thanh tiếng nói, các phụ âm xát (fricatives) (/s/,/h/,/f/) là ví dụ của âm thanh
không là tiếng nói , và các âm bật (plosives) (/k/, /p/, /t/) thuộc về nhóm phụ âm
dừng.
Quá trình tạo tiếng nói bắt đầu từ phổi, nơi mà luồng khí xuất phát. Âm thanh
được hình thành trong quá trình luồng khí đi qua thanh quản và vùng phát âm
(vocal tract). Thanh quản bao gồm sụn thanh quản, hốc phát âm và sụn phễu
(arytenoid cartilage). Vùng phát âm có thể được chia thành ba phần: họng,
khoang mũi, miệng. Lưỡi, vòm miệng, hàm dưới và môi có ảnh hưởng nhất
trong vùng phát âm và do đó tạo nên sự phân biệt của âm thanh. Sơ đồ tổ chức
sự tạo tiếng nói được biểu diễn ở Hình 1.
Tuỳ thuộc vào trạng thái hoạt động của các hốc phát âm, các âm thanh có thể
được chia thành hai nhóm lớn như sau:
Thứ nhất, khi các hốc phát âm đóng mở theo chu kỳ thì sẽ tạo ra một chuỗi các
xung (xung thanh môn). Điều này là cho âm thanh trong trường hợp này có đặc
trưng của tiếng nói đó là: tính chu kỳ trong thời gian và cấu trúc điều hoà trong
tần số.
Thứ hai là các hốc phát âm chỉ mở, hình thành luồng khí chuyển động không
đều giữa các hốc và âm thanh lúc này là nhiễu. Các âm thanh mà không phải là
tiếng nói được hình thành theo cách này. Các phụ âm dừng được sinh ra ngay
khi các hốc phát âm đóng lại.
Mô hình tiếng nói có thể chia thành hai khái niệm khác nhau: Mã hoá hạng

sóng (waveform coding) và mã hoá nguồn (source coding). Ban đầu, người ta đã
cố gắng để mô phỏng tất cả hiện tượng và tín hiệu của chúng như bản thân
chúng vốn có; trong xử lý tiếng nói điều này tương ứng với mã hoá theo dạng
3


sóng. Mã hoá theo dạng sóng đó là cố gắng bảo toàn hình dạng sóng ban đầu và
việc mã hoá đươc dựa vào lượng tử hoá và rút gọn dạng sóng. Mặt khác thì
người ta thường có xu hướng chia mục đích nghiên cứu thành các phần nhỏ hơn,
và phân tích và mô hình các phần đó. Từ những phần đó mà người ta tập hợp lại
thành chủ đề mà cần nghiên cứu. Chính điều này đã dẫn tới khái niệm mã hóa
nguồn, mô hình hoá tiếng nói bằng các tham số khác nhau.
Một nguồn tạo tiếng nói thường được mã hoá như sau:
S(z) = E(z)G(z)V(z)L(z), trong đó E(z) là hàm tác động cho G(z) là mô hình
hình dạng của thanh môn, cho L(z) là mô hình sóng tại môi, V(z) là mô hình
vùng phát âm. Thường thì G(z), V(z) và L(z) được kết hợp thành hô hình cho
vùng phát âm. Hàm E(z) trong miền thời gian là e(n) được gọi là nguồn kích và
nó có thể là chuỗi các xung hoặc nhiễu ngẫu nhiên.
Việc kích của âm thanh tiếng nói thường được mô hình bằng một chuỗi các
xung, còn việc kích của âm thanh không là tiếng nói thì sử dụng kích nhiễu ngẫu
nhiên.
Tiếng nói có thể được xem xét như quá trình dừng cục bộ. Tuy nhiên, các phần
của tiếng nói, ví dụ như các âm thanh tiếng nói (như đã phân chia ở trên) có thể
được xem như các tín hiệu xác định. Tín hiệu tiếng có chu kỳ riêng biệt theo
thời gian lại theo một khuôn dạng, ở đó mẫu thứ n liên quan tới các mẫu gần với
nó (các mẫu có tương quan với nhau).
Do đó mãu thứ n có thể được dự đoán từ các mãu trước đó, hay mẫu s(n) có thể
được biểu diễn bởi các mẫu s(n-k), 1<=k<=p. Đặc trưng dừng cục bộ của các
tín hiễu được thể hiện trong việc dự đoán tuyến tính (LP), tức là mẫu s(n) được
biểu diễn như tổ hợp của các mẫu trước đó. Việc dự đoán này được tối ưu bởi sự

cực tiểu hoá lỗi tiên đoán. Dựa vào các tham số việc tiên đoán, các thuộc tính
khác nhau của một đoạn tiếng nói có thể được mô hình với tiên đoán tuyến tính

4


Hình 1: Tổ chức tạo tiếng nói
Từ việc nghiên cứu cơ chế tạo tiếng nói của con người, người ta đã mô hình hoá
được quá trình tạo tiếng nói trong miền thời gian đã được rời rạc hoá. (Hình 2)

Hình 2: Mô hình rời rạc theo thời gian của việc tạo tiếng nói

5


II.

Xây dựng tuyến âm

Hàm truyền đạt của bôô lọc số ở tần số format Fk được cho bởi:

Trong đó:

T: Chu kì lấy mẫu
2σk : Dải thông (Bk)
Tìm phương trình sai phân mô tả quan hê ê giữ tín hiêêu ra yk(n) và tín
hiêêu vào xk(n):
Từ hàm truyền đạt Hk(z) ta có:

Sử dụng biến đổi z-1:


ta có:

Đăôt:
6


Dk = | zk|2

Ak = -2.|zk|.cosθk ;
Ck =
Ta có:
(n) + Ak.

(n - 1) + Dk.

(n) = Ck.



(n) – Ak.

(n - 2) = Ck.

(n)

(n-1) – Dk.

(n-2)


Đây là phương trình sai phân mô tả quan hêô giữa tín hiêôu ra
hiêôu vào

(n) và tín

(n).

Xây dựng tuyến âm từ phương trình sai phân:
Tuyến âm gồm 3 mạch côông hưởng mắc nối tiếp nhau có phương trình
sai phân như sau:
y(n3)
x(n3)
y(n1)
x(n2)
y(n2)
c1
+
+
+
+
+
x(n1)
c2
c3
Z-1

Z-1

- A1


- A2

- A3

Z-1

Z-1

Z-1

- D1

Z-1

- D2

- D3

III. Đáp ứng tần số của tuyến âm
Từ phương trình sai phân ta có:
yk(n) = Ck.x(n) – Ak.yk(n-1) – Dk.yk(n-2)
 yk(n) + Ak.yk(n-1) + Dk.yk(n-2) = Ck.x(n)
Biến đổi Fourier:
x(n – n0)  e-jnow.x(ejw)
Ta có:
7


Yk(ejw) + Ake-jw.Yk(ejw) + Dk.e-2jw.Yk(ejw) = Ck.Xk(ejw)
Vâôy:


Đăôt Pk =
Qk =

Tuyến âm gồm 3 mạch côông hưởng nên:

IV.

Chương trình mô phỏng:
Chươn trình được viết trong môi trường Android:

8


Hình 3: Giao diện chính của ứng dụng

Hình 4: Đáp ứng biên độ của tuyến âm

9


Hình 5: Đáp ứng pha của tuyến âm

Các hàm tính chuỗi Fourier của H1(ejw), H2(ejw), H3(ejw) và H (ejw)
như sau:
private double Ak(double Fk, double Bk){
return (-2*Math.exp(-(Bk/2)*Ts) * Math.cos(2*PI*Fk*Ts));
}
private double Dk(double Bk, double Fk){
return (Math.pow(Math.abs(-(Bk/2)*Ts),2));

}
private double Ck(double Fk, double Bk){
return (1 + Ak(Fk, Bk) + Dk(Fk, Bk));
}
private double Reality(double F, double Fk, double Bk){
return (1 + Ak(Fk, Bk)*Math.cos(2*PI*F*Ts) + Dk(Fk,
Bk)*Math.cos(4*PI*F*Ts));
}
private double Imaginary(double F, double Fk, double Bk){
return (Ak(Fk, Bk)*Math.sin(2*PI*F*Ts) + Dk(Fk,
Bk)*Math.sin(4*PI*F*Ts));

10


}
public double AmpHk(int F, double Fk, double Bk){
return (Ck(Fk, Bk)/Math.sqrt(Math.pow(Imaginary(F, Fk, Bk),2)+
Math.pow(Reality(F, Fk, Bk),2)));
}
public double PhaseHk(double F, double Fk, double Bk){
return (Math.atan(Imaginary(F, Fk, Bk)/Reality(F, Fk, Bk)));
}
public double AmpH(double F, double F1, double B1, double F2,
double B2, double F3, double B3){
double C, MS, RealNum, ImageNum;
C = Ck(F1, B1) * Ck(F2, B2) * Ck(F3, B3);
MS =
(Math.pow(Reality(F, F1, B1),2) +
Math.pow(Imaginary(F, F1, B1),2)) *

(Math.pow(Reality(F, F2, B2),2) +
Math.pow(Imaginary(F, F2, B2),2)) *
(Math.pow(Reality(F, F3, B3),2) +
Math.pow(Imaginary(F, F3, B3),2));
RealNum = Reality(F, F1, B1)*Reality(F, F2, B2)*Reality(F, F3, B3)
- Reality(F, F1, B1)*Imaginary(F, F2, B2)*Imaginary(F, F3, B3)
- Imaginary(F, F1, B1)*Reality(F, F2, B2)*Imaginary(F, F3, B3)
- Imaginary(F, F1, B1)*Imaginary(F, F2, B2)*Reality(F, F3,
B3);
ImageNum = Reality(F, F1, B1)*Reality(F, F2, B2)*Imaginary(F, F3,
B3)
+ Reality(F, F1, B1)*Imaginary(F, F2, B2)*Reality(F, F3,
B3)
+ Imaginary(F, F1, B1)*Reality(F, F2, B2)*Reality(F, F3,
B3)
- Imaginary(F, F1, B1)*Imaginary(F, F2, B2)*Imaginary(F,
F3, B3);
return (C*Math.sqrt(Math.pow(RealNum,2)+Math.pow(ImageNum,2))/MS);
}
public double PhaseH(double F, double F1, double B1, double F2,
double B2, double F3, double B3){
double RealNum, ImageNum;
RealNum = Reality(F, F1, B1)*Reality(F, F2, B2)*Reality(F, F3,
B3)
- Reality(F, F1, B1)*Imaginary(F, F2, B2)*Imaginary(F,
F3, B3)
- Imaginary(F, F1, B1)*Reality(F, F2, B2)*Imaginary(F,
F3, B3)
- Imaginary(F, F1, B1)*Imaginary(F, F2, B2)*Reality(F,
F3, B3);

ImageNum = Reality(F, F1, B1)*Reality(F, F2, B2)*Imaginary(F,
F3, B3)
+ Reality(F, F1, B1)*Imaginary(F, F2, B2)*Reality(F,
F3, B3)
+ Imaginary(F, F1, B1)*Reality(F, F2, B2)*Reality(F,
F3, B3)
- Imaginary(F, F1, B1)*Imaginary(F, F2,
B2)*Imaginary(F, F3, B3);
return (Math.atan(ImageNum/RealNum));
}

Hàm vẽ đồ thị:
11


package com.example.firstandroidproject;
//Sử dung thư viện mã nguồn mở GraphView để vẽ đồ thị
import com.jjoe64.graphview.*;
import com.jjoe64.graphview.GraphViewSeries.GraphViewSeriesStyle;
import
import
import
import
import
import

android.support.v7.app.ActionBarActivity;
android.graphics.Color;
android.os.Bundle;
android.view.Menu;

android.view.MenuItem;
android.widget.*;

public class Graph extends ActionBarActivity {
private tinhtoan tinh;
private GraphView.GraphViewData[] data;
private static final int num = 201;
private GraphViewSeries exampleSeries;
LinearLayout layout;
String title = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_graph);

Bundle extra = getIntent().getExtras();
if(extra == null){
return;
}
double f1 = Double.parseDouble(extra.getString("f1"));
double f2 = Double.parseDouble(extra.getString("f2"));
double f3 = Double.parseDouble(extra.getString("f3"));
double b1 = Double.parseDouble(extra.getString("b1"));
double b2 = Double.parseDouble(extra.getString("b2"));
double b3 = Double.parseDouble(extra.getString("b3"));
boolean rbBiendo = extra.getBoolean("rbBiendo");
boolean rbPha = extra.getBoolean("rbPha");
tinh = new tinhtoan();
data = new GraphView.GraphViewData[num];
layout = (LinearLayout) findViewById(R.id.layout);

if(rbBiendo == true){
title = "Ðáp ứng biên độ";
for(int i=0;idata[i] = new
GraphView.GraphViewData(50*i,tinh.AmpH(50*i,f1,b1,f2,b2,f3,b3));
}
exampleSeries = new GraphViewSeries(data);
}
else if(rbPha== true){

12


title = "Ðáp ứng pha";
for(int i=0;idata[i] = new
GraphView.GraphViewData(50*i,tinh.PhaseH(50*i,f1,b1,f2,b2,f3,b3));
}
exampleSeries = new GraphViewSeries(data);
}
GraphView graphView = new LineGraphView(
this // context
, title // heading
);
graphView.addSeries(exampleSeries);
graphView.getGraphViewStyle().setGridColor(Color.GREEN);
graphView.getGraphViewStyle().setHorizontalLabelsColor(Color.WHITE);
graphView.getGraphViewStyle().setVerticalLabelsColor(Color.WHITE);
graphView.getGraphViewStyle().setTextSize(40);
graphView.getGraphViewStyle().setNumHorizontalLabels(5);

graphView.getGraphViewStyle().setNumVerticalLabels(4);
layout.addView(graphView);
layout.setBackgroundColor(Color.BLACK);
}
}

13


Kết luâôn
Chương trình chạy ổn định, giao diêôn thân thiêôn, bố trí hợp lý.
Rất mong nhâôn được những lời góp ý của thầy.
Chúng em xin chân thành cảm ơn thầy!
Nhóm sinh viên
Phạm Quang Tùng
Nguyễn Văn Công

14



×