1.声线年龄层怎么划分?
2.AgilentE8267D安捷伦E8267D射频发生器E8267D参数资料
3.电脑如何编写系统电脑系统是赫兹赫兹如何制作的
4.è±è¯ç¿»è¯
5.ATIHD5650显卡怎么样
声线年龄层怎么划分?
从EDA、音频预处理到特征工程和数据建模的源码完整源代码演示
大多数人都熟悉如何在图像、文本或表格数据上运行数据科学项目。生成 但处理音频数据的赫兹赫兹样例非常的少见。 在本文中,源码将介绍如何在机器学习的生成NFA源码帮助下准备、探索和分析音频数据。赫兹赫兹 简而言之:与其他的源码形式(例如文本或图像)类似我们需要将音频数据转换为机器可识别的格式。
音频数据的生成有趣之处在于您可以将其视为多种不同的模式:
· 可以提取高级特征并分析表格数据等数据。
· 可以计算频率图并分析图像数据等数据。赫兹赫兹
· 可以使用时间敏感模型并分析时间序列数据等数据。源码
· 可以使用语音到文本模型并像文本数据一样分析数据。生成
在本文中,赫兹赫兹我们将介绍前三种方法。源码 首先看看音频数据的生成实际样子。
音频数据的格式
虽然有多个 Python 库可以处理音频数据,但我们推荐使用 librosa。 让我们加载一个 MP3 文件并绘制它的内容。
# Import librosa
import librosa
# Loads mp3 file with a specific sampling rate, here kHz
y, sr = librosa.load("c4_sample-1.mp3", sr=_)
# Plot the signal stored in 'y'
from matplotlib import pyplot as plt
import librosa.display
plt.figure(figsize=(, 3))
plt.title("Audio signal as waveform")
librosa.display.waveplot(y, sr=sr);
这里看到的是句子的波形表示。
1、波形 - 信号的时域表示
之前称它为时间序列数据,但现在我们称它为波形? 当只看这个音频文件的一小部分时,这一点变得更加清晰。 下图显示了与上面相同的内容,但这次只有 .5 毫秒。
我们看到的是一个时间信号,它以不同的频率和幅度在值 0 附近振荡。该信号表示气压随时间的变化,或扬声器膜(或耳膜)的物理位移 . 这就是为什么这种对音频数据的描述也称为波形的原因。
频率是该信号振荡的速度。 低频例如 Hz 可能是低音吉他的声音,而鸟儿的歌声可能是 Hz 的更高频率。 我们人类语言通常介于两者之间。
要知道这个信号在单位时间内从连续信号中提取并组成离散信号的采样个数,我们使用赫兹(Hz)来表示每秒的采样个数。 ' 或 k Hz表示美标采集了次。 我们在上图中可以看到的 1' 个时间点代表了 .5 毫秒(/ = 0.)的音频信号。
2、傅里叶变换——信号的频域表示
虽然之前的可视化可以告诉我们什么时候发生了(即 2 秒左右似乎有很多波形信号),但它不能真正告诉我们它发生的频率。 因为波形向我们显示了有关时间的信息,所以该信号也被称为信号的时域表示。
可以使用快速傅立叶变换,反转这个问题并获得关于存在哪些频率的信息,同时丢弃掉关于时间的信息。 在这种情况下,信号表示被称为信号的频域表示。
让我们看看之前的句子在频域中的表现。
import scipy
import numpy as np
# Applies fast fourier transformation to the signal and takes absolute values
y_freq = np.abs(scipy.fftpack.fft(y))
# Establishes all possible frequency
# (dependent on the sampling rate and the length of the signal)
f = np.linspace(0, sr, len(y_freq))
# Plot audio signal as frequency information.
plt.figure(figsize=(, 3))
plt.semilogx(f[: len(f) // 2], y_freq[: len(f) // 2])
plt.xlabel("Frequency (Hz)")
plt.show();
可以在此处看到大部分信号在 ~ 到 ~ Hz 之间(即 ² 到 ³ 之间)。 另外,似乎还有一些从 1' 到 ' Hz 的内容。
3、频谱图
我们并不总是需要决定时域或频域。 使用频谱图同时表示这两个领域中的信息,同时将它们的大部差别保持在最低限度。 有多种方法可以创建频谱图,但在本文中将介绍常见的三种。
3a 短时傅里叶变换 (STFT)
这时是之前的快速傅立叶变换的小型改编版本,即短时傅立叶变换 (STFT), 这种方式是以滑动窗口的方式计算多个小时间窗口(因此称为“短时傅立叶”)的 FFT。
import librosa.display
# Compute short-time Fourier Transform
x_stft = np.abs(librosa.stft(y))
# Apply logarithmic dB-scale to spectrogram and set maximum to 0 dB
x_stft = librosa.amplitude_to_db(x_stft, ref=np.max)
# Plot STFT spectrogram
plt.figure(figsize=(, 4))
librosa.display.specshow(x_stft, sr=sr, x_axis="time", y_axis="log")
plt.colorbar(format="%+2.0f dB")
plt.show();
与所有频谱图一样,颜色代表在给定时间点给定频率的量(响度/音量)。 +0dB 是最响亮的,-dB 接近静音。 在水平 x 轴上我们可以看到时间,而在垂直 y 轴上我们可以看到不同的频率。
3b 梅尔谱图
作为 STFT 的替代方案,还可以计算基于 mel 标度的梅尔频谱图。 这个尺度解释了我们人类感知声音音高的方式。 计算 mel 标度,以便人类将由 mel 标度中的 delta 隔开的两对频率感知为具有相同的感知差异。
梅尔谱图的计算与 STFT 非常相似,主要区别在于 y 轴使用不同的刻度。
# Compute the mel spectrogram
x_mel = librosa.feature.melspectrogram(y=y, sr=sr)
# Apply logarithmic dB-scale to spectrogram and set maximum to 0 dB
x_mel = librosa.power_to_db(x_mel, ref=np.max)
# Plot mel spectrogram
plt.figure(figsize=(, 4))
librosa.display.specshow(x_mel, sr=sr, x_axis="time", y_axis="mel")
plt.colorbar(format="%+2.0f dB")
plt.show();
与 STFT 的区别可能不太明显,但如果仔细观察,就会发现在 STFT 图中,从 0 到 Hz 的trafficstats 源码频率在 y 轴上占用的空间比在 mel 图中要大得多 .
3c 梅尔频率倒谱系数 (MFCC)
梅尔频率倒谱系数 (MFCC) 是上面梅尔频谱图的替代表示。 MFCC 相对于 梅尔谱图的优势在于特征数量相当少(即独特的水平线标度),通常约为 。
由于梅尔频谱图更接近我们人类感知音高的方式,并且 MFCC 只有少数几个分量特征,所以大多数机器学习从业者更喜欢 使用MFCC 以“图像方式”表示音频数据。 但是对于某些问题,STFT、mel 或波形表示可能会更好。
让我们继续计算 MFCC 并绘制它们。
# Extract 'n_mfcc' numbers of MFCCs components (here )
x_mfccs = librosa.feature.mfcc(y, sr=sr, n_mfcc=)
# Plot MFCCs
plt.figure(figsize=(, 4))
librosa.display.specshow(x_mfccs, sr=sr, x_axis="time")
plt.colorbar()
plt.show();
数据清洗
现在我们更好地理解了音频数据的样子,让我们可视化更多示例。
在这四个示例中,我们可以收集到有关此音频数据集的更多问题:
· 大多数录音在录音的开头和结尾都有一段较长的静默期(示例 1 和示例 2)。 这是我们在“修剪”时应该注意的事情。
· 在某些情况下,由于按下和释放录制按钮,这些静音期会被“点击”中断(参见示例 2)。
· 一些录音没有这样的静音阶段,即一条直线(示例 3 和 4)。
· 在收听这些录音时,有大量背景噪音。
为了更好地理解这在频域中是如何表示的,让我们看一下相应的 STFT 频谱图。
当听录音时,可以观察到样本 3 具有覆盖多个频率的不同背景噪声,而样本 4 中的背景噪声相当恒定。 这也是我们在上图中看到的。 样本 3 在整个过程中都非常嘈杂,而样本 4 仅在几个频率上(即粗水平线)有噪声。 我们不会详细讨论如何消除这种噪音,因为这超出了本文的范围。
但是让我们研究一下如何消除此类噪音并修剪音频样本的“捷径”。 虽然使用自定义过滤函数的更手动的方法可能是从音频数据中去除噪声的最佳方法,但在我们的例子中,将推荐使用实用的 python 包 noisereduce。
import noisereduce as nr
from scipy.io import wavfile
# Loop through all four samples
for i in range(4):
# Load audio file
fname = "c4_sample-%d.mp3" % (i + 1)
y, sr = librosa.load(fname, sr=_)
# Remove noise from audio sample
reduced_noise = nr.reduce_noise(y=y, sr=sr, stationary=False)
# Save output in a wav file as mp3 cannot be saved to directly
wavfile.write(fname.replace(".mp3", ".wav"), sr, reduced_noise)
聆听创建的 wav 文件,可以听到噪音几乎完全消失了。 虽然我们还引入了更多的代码,但总的来说我们的去噪方法利大于弊。
对于修剪步骤,可以使用 librosa 的 .effects.trim() 函数。每个数据集可能需要一个不同的 top_db 参数来进行修剪,所以最好进行测试,看看哪个参数值好用。 在这个的例子中,它是 top_db=。
# Loop through all four samples
for i in range(4):
# Load audio file
fname = "c4_sample-%d.wav" % (i + 1)
y, sr = librosa.load(fname, sr=_)
# Trim signal
y_trim, _ = librosa.effects.trim(y, top_db=)
# Overwrite previous wav file
wavfile.write(fname.replace(".mp3", ".wav"), sr, y_trim)
现在让我们再看一下清理后的数据。
看样子好多了
特征提取
数据是干净的,应该继续研究可以提取的特定于音频的特征了。
1、开始检测
通过观察一个信号的波形,librosa可以很好地识别一个新口语单词的开始。
# Extract onset timestamps of words
onsets = librosa.onset.onset_detect(
y=y, sr=sr, units="time", hop_length=, backtrack=False)
# Plot onsets together with waveform plot
plt.figure(figsize=(8, 3))
librosa.display.waveplot(y, sr=sr, alpha=0.2, x_axis="time")
for o in onsets:
plt.vlines(o, -0.5, 0.5, colors="r")
plt.show()
# Return number of onsets
number_of_words = len(onsets)
print(f"{ number_of_words} onsets were detected in this audio signal.")
>>> 7 onsets were detected in this audio signal
2、录音的长度
与此密切相关的是录音的长度。录音越长,能说的单词就越多。所以计算一下录音的长度和单词被说出的速度。
duration = len(y) / sr
words_per_second = number_of_words / duration
print(f"""The audio signal is { duration:.2f} seconds long,
with an average of { words_per_second:.2f} words per seconds.""")
>>> The audio signal is 1. seconds long,
>>> with an average of 4. words per seconds.
3、节奏
语言是一种非常悦耳的信号,每个人都有自己独特的说话方式和语速。因此,可以提取的另一个特征是说话的节奏,即在音频信号中可以检测到的节拍数。
# Computes the tempo of a audio recording
tempo = librosa.beat.tempo(y, sr, start_bpm=)[0]
print(f"The audio signal has a speed of { tempo:.2f} bpm.")
>>> The audio signal has a speed of . bpm.
4、基频
基频是周期声音出现时的最低频率。在音乐中也被称为音高。在之前看到的谱图图中,基频(也称为f0)是图像中最低的亮水平条带。而在这个基本音之上的带状图案的重复称为谐波。
为了更好地说明确切意思,下面提取基频,并在谱图中画出它们。
# Extract fundamental frequency using a probabilistic approach
f0, _, _ = librosa.pyin(y, sr=sr, fmin=, fmax=, frame_length=)
# Establish timepoint of f0 signal
timepoints = np.linspace(0, duration, num=len(f0), endpoint=False)
# Plot fundamental frequency in spectrogram plot
plt.figure(figsize=(8, 3))
x_stft = np.abs(librosa.stft(y))
x_stft = librosa.amplitude_to_db(x_stft, ref=np.max)
librosa.display.specshow(x_stft, sr=sr, x_axis="time", y_axis="log")
plt.plot(timepoints, f0, color="cyan", linewidth=4)
plt.show();
在 Hz 附近看到的绿线是基本频率。 但是如何将其用于特征工程呢? 可以做的是计算这个 f0 的具体特征。
# Computes mean, median, 5%- and %-percentile value of fundamental frequency
f0_values = [
np.nanmean(f0),
np.nanmedian(f0),
np.nanstd(f0),
np.nanpercentile(f0, 5),
np.nanpercentile(f0, ),
]
print("""This audio signal has a mean of { :.2f}, a median of { :.2f}, a
std of { :.2f}, a 5-percentile at { :.2f} and a -percentile at { :.2f}.""".format(*f0_values))
>>> This audio signal has a mean of ., a median of ., a
>>> std of 4., a 5-percentile at . and a -percentile at ..
除以上说的技术意外,还有更多可以探索的老祖源码音频特征提取技术,这里就不详细说明了。
音频数据集的探索性数据分析 (EDA)
现在我们知道了音频数据是什么样子以及如何处理它,让我们对它进行适当的 EDA。 首先下载一个数据集Kaggle 的 Common Voice 。 这个 GB 的大数据集只是来自 Mozilla 的 + GB 大数据集的一个小的快照。 对于本文这里的示例,将只使用这个数据集的大约 9' 个音频文件的子样本。
看看这个数据集和一些已经提取的特征。
1、特征分布调查
目标类别年龄和性别的类别分布。
目标类别分布是不平衡的
下一步,让我们仔细看看提取的特征的值分布。
除了 words_per_second,这些特征分布中的大多数都是右偏的,因此可以从对数转换中获益。
import numpy as np
# Applies log1p on features that are not age, gender, filename or words_per_second
df = df.apply(
lambda x: np.log1p(x)
if x.name not in ["age", "gender", "filename", "words_per_second"]
else x)
# Let's look at the distribution once more
df.drop(columns=["age", "gender", "filename"]).hist(
bins=, figsize=(, ))
plt.show();
好多了,但有趣的是 f0 特征似乎都具有双峰分布。 让我们绘制与以前相同的内容,但这次按性别分开。
正如怀疑的那样,这里似乎存在性别效应! 但也可以看到,一些 f0 分数(这里特别是男性)比应有的低和高得多。 由于特征提取不良,这些可能是异常值。 仔细看看下图的所有数据点。
# Plot sample points for each feature individually
df.plot(lw=0, marker=".", subplots=True, layout=(-1, 3),
figsize=(, 7.5), markersize=2)
plt.tight_layout()
plt.show();
鉴于特征的数量很少,而且有相当漂亮的带有明显尾部的分布,可以遍历它们中的每一个,并逐个特征地确定异常值截止阈值。
2、特征的相关性
下一步,看看所有特征之间的相关性。 但在这样做之前需要对非数字目标特征进行编码。 可以使用 scikit-learn 的 OrdinalEncoder 来执行此操作,但这可能会破坏年龄特征中的正确顺序。 因此在这里手动进行映射。
# Map age to appropriate numerical value
df.loc[:, "age"] = df["age"].map({
"teens": 0,
"twenties": 1,
"thirties": 2,
"fourties": 3,
"fifties": 4,
"sixties": 5})
# Map gender to corresponding numerical value
df.loc[:, "gender"] = df["gender"].map({ "male": 0, "female": 1})
现在可以使用 pandas 的 .corr() 函数和 seaborn 的 heatmap() 来更深入地了解特征相关性。
import seaborn as sns
plt.figure(figsize=(8, 8))
df_corr = df.corr() *
sns.heatmap(df_corr, square=True, annot=True, fmt=".0f",
mask=np.eye(len(df_corr)), center=0)
plt.show();
非常有趣!提取的 f0 特征似乎与性别目标有相当强的关系,而年龄似乎与任何其他的特征都没有太大的相关性。
3、频谱图特征
目前还没有查看实际录音。 正如之前看到的,有很多选择(即波形或 STFT、mel 或 mfccs 频谱图)。
音频样本的长度都不同,这意味着频谱图也会有不同的长度。 因此为了标准化所有录音,首先要将它们剪切到正好 3 秒的长度:太短的样本会被填充,而太长的样本会被剪掉。
一旦计算了所有这些频谱图,我们就可以继续对它们执行一些 EDA! 而且因为看到“性别”似乎与录音有特殊的关系,所以分别可视化两种性别的平均梅尔谱图,以及它们的差异。
男性说话者的平均声音低于女性。 这可以通过差异图中的较低频率(在红色水平区域中看到)的更多强度来看出。
模型选择
现在已经可以进行建模了。我们有多种选择。关于模型,我们可以……
· 训练我们经典(即浅层)机器学习模型,例如 LogisticRegression 或 SVC。
· 训练深度学习模型,即深度神经网络。
· 使用 TensorflowHub 的预训练神经网络进行特征提取,然后在这些高级特征上训练浅层或深层模型
而我们训练的数据是
· CSV 文件中的数据,将其与频谱图中的“mel 强度”特征相结合,并将数据视为表格数据集
· 单独的梅尔谱图并将它们视为图像数据集
· 使用TensorflowHub现有模型提取的高级特征,将它们与其他表格数据结合起来,并将其视为表格数据集
当然,有许多不同的方法和其他方法可以为建模部分创建数据集。因为我们没有使用全量的数据,所以在本文我们使用最简单的机器学习模型。
经典(即浅层)机器学习模型
这里使用EDA获取数据,与一个简单的gargoyle源码 LogisticRegression 模型结合起来,看看我们能在多大程度上预测说话者的年龄。除此以外还使用 GridSearchCV 来探索不同的超参数组合,以及执行交叉验证。
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import RobustScaler, PowerTransformer, QuantileTransformer
from sklearn.decomposition import PCA
from sklearn.pipeline import Pipeline
from sklearn.model_selection import GridSearchCV
# Create pipeline
pipe = Pipeline(
[
("scaler", RobustScaler()),
("pca", PCA()),
("logreg", LogisticRegression(class_weight="balanced")),
]
)
# Create grid
grid = {
"scaler": [RobustScaler(), PowerTransformer(), QuantileTransformer()],
"pca": [None, PCA(0.)],
"logreg__C": np.logspace(-3, 2, num=),
}
# Create GridSearchCV
grid_cv = GridSearchCV(pipe, grid, cv=4, return_train_score=True, verbose=1)
# Train GridSearchCV
model = grid_cv.fit(x_tr, y_tr)
# Collect results in a DataFrame
cv_results = pd.DataFrame(grid_cv.cv_results_)
# Select the columns we are interested in
col_of_interest = [
"param_scaler",
"param_pca",
"param_logreg__C",
"mean_test_score",
"mean_train_score",
"std_test_score",
"std_train_score",
]
cv_results = cv_results[col_of_interest]
# Show the dataframe sorted according to our performance metric
cv_results.sort_values("mean_test_score", ascending=False)
作为上述 DataFrame 输出的补充,还可以将性能得分绘制为探索的超参数的函数。 但是因为使用了有多个缩放器和 PCA ,所以需要为每个单独的超参数组合创建一个单独的图。
在图中,可以看到总体而言模型的表现同样出色。 当降低 C 的值时,有些会出现更快的“下降”,而另一些则显示训练和测试(这里实际上是验证)分数之间的差距更大,尤其是当我们不使用 PCA 时。
下面使用 best_estimator_ 模型,看看它在保留的测试集上的表现如何。
# Compute score of the best model on the withheld test set
best_clf = model.best_estimator_
best_clf.score(x_te, y_te)
>>> 0.
这已经是一个很好的成绩了。 但是为了更好地理解分类模型的表现如何,可以打印相应的混淆矩阵。
虽然该模型能够检测到比其他模型更多的 岁样本(左混淆矩阵),但总体而言,它实际上在对 岁和 岁的条目进行分类方面效果更好(例如,准确率分别为 % 和 %)。
总结
在这篇文章中,首先看到了音频数据是什么样的,然后可以将其转换成哪些不同的形式,如何对其进行清理和探索,最后如何将其用于训练一些机器学习模型。如果您有任何问题,请随时发表评论。
最后本文的源代码在这里下载:
/post/5cfeda9d3dc
作者:Michael Notter
AgilentED安捷伦ED射频发生器ED参数资料
安捷伦ED射频发生器是一款功能全面的测试设备,主要应用于测量电子设备中的滤波器、放大器和电气元件的响应。其频率范围宽广,从 kHz至 GHz,且可选配至.8 GHz或 GHz,实现更广阔的测试覆盖。ED具备0.赫兹的分辨率,输出功率从+ dBm(0.4至 GHz)到+ dBm( GHz)不等,满足不同测试需求。
该发生器支持多种调制模式,包括AM、FM、?M和脉冲,以及ASK、FSK、MSK、PSK、QAM和自定义I/Q调制。此外,它还提供步进、列表和斜坡扫描功能,以及源代码控制(使用PSA系列选件),便于进行复杂的信号生成和测试。内置的任意波形生成能力,以及与宽带任意波形发生器的兼容性,使得ED能够创建各种参考信号,包括雷达、多音、NPR、自定义调制、WLAN、GPS等。
ED具备 MHz(可扩展至2 GHz)的射频调制带宽,以及BaseT局域网和GPIB接口,支持SCPI和IVI-COM驱动程序,实现与各种测试系统和软件的无缝集成。其集成的微波矢量信号发生器,具有 GHz的I/Q调制能力和 GHz的典型输出功率,配合- dBc/Hz的相位噪声性能,使其成为高性能微波源的理想选择。
该发生器的宽带内部基带发生器功能,可播放任意波形或生成复杂的实时信号,极大提高了信号生成的灵活性和多样性。内置宽带I/Q调制器,支持高达2 GHz的射频调制带宽,与Agilent NA独立宽带任意波形发生器相辅相成,rpgc 源码适用于高达1 GHz射频的I/Q波形仿真。这种集成矢量功能的创新设计,简化了复杂调制信号的生成过程,适用于航空航天、国防、卫星通信和宽带无线等领域的设计和制造测试。
电脑如何编写系统电脑系统是如何制作的
‘壹’ 怎么编写电脑系统
1. 建立开发环境
这一步非常的简单。
将masm和vc的压缩包分别解压到e:masm和e:msvc目录下。你也可以放到其他目录下,根据自己的情况而定,但是下面用到的编译命令需要作相应的修改。也不需要添加或修改任何的环境变量。
2. IBM PC的启动及当时的内存使用情况
这一部分内容已经是老生常谈了,但又不能不说。我们只说从硬盘引导的情况。
当BIOS经过POST(Power On Test Self)后,将硬盘MBR读到内存0x:0x7C的位置,然后从这里开始执行。一般的情况,MBR将选择活动分区进行操作系统的启动。在MBR开始执行时,内存使用的情况如下图所示,地址数据用进制表示:
这已经是老掉牙的内容了,但是,在年前却十分流行。如果想更详细的了解这方面的内容,找本讲解DOS的书看看吧。
我们自己的操作系统将被加载到0x:0x。这不是必需或者必然的,是人为选择的,你也可以将其放在0x:等其他地方。但是,上图中注明有其他用途的内存区域,应该保留,否则,你会后悔的。
3. 开发操作系统
我们自己的操作系统运行在实模式环境下(如果您不知道什么是实模式,也请看看年前出版的当时非常流行的书,或者直接请教当时的前辈高手)。即使你的电脑是P4的CPU,刚启动时,也只相当于主频较高的而已。但是,没有关系。
首先,使用汇编语言写一个框架,文件名是entry.asm:
; entry.asm
; Copyright (C) , Tian XiangYuan
.MODEL TINY,C
.p
option expr
option casemap:none
cmain PROTO NEAR C
.CODE
ORG h ;偏移地址
_start:
jmp begin
nop
DB 'TianXiangYuan',0 ;the magic of my os
begin:
cli
mov ax,cs
mov ds,ax
mov es,ax
mov ss,ax
mov sp,0FFFFh
sti
call cmain ;调用C语言写的主函数
mov ax,4ch ;调用DOS的功能(为了调试),与我们自己的操作系统无关
int h
这段代码非常简单,应该没有什么问题。
已经说了,操作系统将从0x:0x加载,说是无心,实则有意。我们知道,TINY模式的程序,在DOS下运行时,其起始地址就是0x,前面的Byte是参数部分。如果直接将操作系统在系统启动时加载到0x:0x,调试时非常麻烦。我们将其起始地址设为0x,使其可以在DOS下运行(这也是在程序的最后包含int h指令的原因),确认正确无误后,再进行下一步的开发。
下面再看C语言的代码,文件名是main.c:
……
static void InitShell()
{
}
void cmain()
{
InitShell();
TermShell();
}
顾名思义,其中实现了一个简单的shell。因为该程序本身是操作系统的一部分,所以,平时经常使用的一些C库函数,在这里就不能使用了。总之,一切都要自己动手实现。幸好,在实模式下,几乎所有的设备的驱动都包含在BIOS中了,我们可以直接使用。否则,连从键盘读一个键值这样的事都需要自己写键盘的驱动程序,实在太难了。也是这个原因,我们自己的操作系统没有将CPU转到保护模式下,有心之人可以试试。
下面的事情几乎都可以使用C语言实现了。
第一,初始化显示模式。系统启动时,显卡已经被初始化成3模式了,就是X的彩色模式(除非你的显示器是单色显示器),我们不需要再做什么了。当然,你也可以将显卡设成VGA甚至SVGA模式,只要你的BIOS和显卡支持。
第二,实现一个具有简单交互功能的shell。代码不全,请自己补齐,或参看附件。
/
**从键盘读一个字符,如果没有输入,则等待;返回值的低字节为asii码,高字节为键盘扫描码
*/
static int getch()
{
int chr=0;
__asm
{
mov ah,h
int h
mov chr,ax
}
return chr;
}
/
**使用TTY模式向屏幕输出一个字符
*/
static void putch(unsigned char key)
{
__asm
{
mov bh,0
mov al,key
mov ah,0Eh
int h
}
}
#define KEY_BACKSPACE 0x
#define KEY_ENTER 0x0D
#define KEY_NEWLINE 0x0A
#define KEY_ESCAPE 0x1B
static int printk(const char* str,...)
{
…… //给大家一点空间,自己实现吧
}
static void endline()
{
putch(KEY_NEWLINE); //Line Feed (LF)
putch(KEY_ENTER); //Enter (CR)
}
static char msg_prompt[]="CMD:";
static void deal_cmd(char* cmd_line,int cmd_len)
{
…… //也请大家自己实现吧,例如,可以实现help,dir,cls,halt等命令
…… //其实,就是字符串比较的过程
}
static void TermShell()
{
char cmd_line[]={ 0,};
int cmd_len=0;
endline();
printk(msg_prompt,sizeof(msg_prompt));
for (;;)
{
cmd_line[cmd_len]=getch();
switch(cmd_line[cmd_len])
{
case KEY_ENTER:
if (cmd_len>1)
deal_cmd(cmd_line,cmd_len);
//break;
case KEY_ESCAPE:
cmd_len=0;
endline();
printk(msg_prompt,sizeof(msg_prompt));
break;
case KEY_BACKSPACE:
if (cmd_len>0)
{
putch(0x);
putch(' ');
putch(0x);
cmd_len--;
}
break;
default:
putch(cmd_line[cmd_len]);
cmd_len++;
}
}
}
更复杂、功能更强大的方法请参考BIOS的相关文档。也请大家发挥想象力,不断的扩展功能。说心里话,这个“操作系统”比dos还原始!但毕竟是自己的操作系统。
‘贰’ 电脑系统是如何制作的
开机放入光盘,按Del进BIOS,找到Advanced Bios Features(高级BIOS参数设置)按回车进Advanced Bios Features(高级BIOS参数设置)界面。找到First Boot Device ,用PgUp或PgDn键,将HDD-O(硬盘启动)改为CDROM(光驱启动),按ESC,按F,按Y,回车,保存退出。 这时要注意观察,启动时计算机会先检测光驱,屏幕下面出现一行字符,意思就是让你按任意键进入光盘启动。按一下,听到光驱开始疯转,装系统的过程就正式开始了! 装系统中: 看屏幕中的提示,因为都是中文的所以几乎不需要介绍什么。首先需要用户选择是安装新的操作系统还是修复,选择安装新的操作系统,然后按F8同意那些协议,出现盘符选择界面。 用键盘上下键移动光标至你要安装的盘符上,按“D”键,系统会提示说删除该盘将会删除所有资料,不管它,接着按“L”键再确定删除。完成后屏幕返回到刚才的界面。然后选择“在当前盘安装WindowsXP”(大概意思,原文不记的了)后按回车,系统提示要格式化该盘。选择“快速NTFS方式”格式化,此时出现格式化界面,稍候等进度条到%时计算机开始自动装入光驱中的安装文件,大概时间8分钟左右(视光驱速度而定),完成后系统自动重启。 注意,此时要将光驱里的安装盘取出,为的是避免重启后又自动读取。 重启后再次进入安装界面,此时将安装盘再放入后安装继续,几乎不需要你做任何设置,点“下一步”就可以。不过中间有一个输入序列号的过程得动动手。 这个过程大概分钟左右,其间屏幕会显示一些关于windowsXP的相关功能信息,可以留意一下。完成后系统提示将安装盘取出。你拿出来后,重启,顺便进BIOS将开机启动顺序改回至硬盘启动,基本上就完成安装过程了! 装系统后: 一般在进入系统后常用硬件的驱动都已经安装好,但不是全部。这时就需要用户自己来安装。首先查看机器哪些驱动未安装!右键点击“我的电脑”,选“属性”,在“硬件”标签里点击“设备管理器”,凡是在设备前面有一个问号图标的均表示该设备有问题。双击,按上面的提示将驱动安装好。直到前面的“问号”全部消失为止。 需要装的驱动一般有显卡、声卡、网卡、猫,一些比较高级的机器还有红外、蓝牙等适配器的驱动。 下面就是对系统的一些优化设置,如果你的机器配置不高,建议按我说的做。 重启, 1> 右键单击屏幕,选择“属性”。点击“外观”标签,在“外观与按钮”的下拉菜单中选择“Windows经典样式”,然后在“设置”标签里,按个人喜好调整屏幕分辨率大写,一般为*。如果你用的是普通CRT显示器,需要再点“监视器”标签,将“屏幕刷新频率”调整至“赫兹”,点确定!屏幕看起来是不是舒服多了? 2> 右键单击任务栏,选择“属性”,在“任务栏”标签项中将“显示快速启动”前的复选框选中。然后再点击““开始”菜单”标签,将菜单类改成“经典“开始”菜单”,点“确定”,看看现在的样子是不是要舒服点呢?( 3> 右键单击我的电脑,选择“高级”标签。单击性能项里的“设置”按钮。在视觉效果项里先点击“调整为最佳性能”,然后在下面的复选项里选中“在文件夹中使用常见任务”。
赞同|评论(2)
‘叁’ 电脑如何自己做系统
我自己有写的教程ifloveu.com
‘肆’ 电脑系统怎么做
在开始回答你的问题之前,先看看程序的发展历史,请留意有关储存器和数据的描述:
年:Babbage 设想制造一台通用分析机,在只读存储器(穿孔卡片)中存储程序和数据 。Babbage在以后的时间里继续他的研究工作,并于 年将操作位数提高到了 位,并基本实现了控制中心(CPU)和存储程序的设想,而且程序可以根据条件进行跳转,能在几秒内做出一般的加法,几分钟内做出乘、除法。
年:美国人口普查部门希望能得到一台机器帮助提高普查效率。Herman Hollerith (后来他的公司发展成了IBM 公司)借鉴Babbage 的发明,用穿孔卡片存储数据,并设计了机器。结果仅用6 周就得出了准确的人口统计数据(如果用人工方法,大概要花 年时间)。
年:IBM 推出IBM 机。这是一台能在一秒钟内算出乘法的穿孔卡片计算机 。这台机器无论在自然科学还是在商业应用上都具有重要的地位,大约制造了 台。
年夏季:Atanasoff 和学生Berry 完成了能解线性代数方程的计算机,取名叫"ABC "(Atanasoff-Berry Computer),用电容作存储器 ,用穿孔卡片作辅助存储器,那些孔实际上是"烧"上去的,时钟频率是Hz,完成一次加法运算用时一秒。
年1 月:Mark I 自动顺序控制计算机在美国研制成功。整个机器有 英尺长 、5 吨重 、万个零部件。该机使用了 个继电器, 个开关作为机械只读存储器。程序存储在纸带上 ,数据可以来自纸带或卡片阅读器。Mark I 被用来为美国海军计算弹道火力表。
年9 月:Williams 和Stibitz 完成了"Relay Interpolator ",后来命名为"Model Ⅱ Re-
lay Calculator "的计算机。这是一台可编程计算机,同样使用纸带输入程序和数据。它运行更可靠,每个数用7 个继电器表示,可进行浮点运算。
真空管时代的计算机尽管已经步入了现代计算机的范畴,但因其体积大、能耗高、故障多、价格贵,从而制约了它的普及和应用。直到晶体管被发明出来,电子计算机才找到了腾飞的起点。
年:Bell 实验室的William B.Shockley 、 John Bardeen 和Walter H.Brattain 发明了晶体
管,开辟了电子时代新纪元。
年:剑桥大学的Wilkes 和他的小组制成了一台可以存储程序的计算机,输入输出设备仍是纸带。
年:EDVAC(Electronic Discrete Variable Automatic Computer--电子离散变量自动计算机)--第一台使用磁带的计算机。这是一个突破,可以多次在磁带上存储程序。这台机器是John von Neumann 提议建造的。
年:日本东京帝国大学的Yoshiro Nakamats 发明了软磁盘 ,其销售权由IBM公司获得 。由此开创了存储时代的新纪元。
年:Grace Murray Hopper 完成了高级语言编译器。
年:UNIVAC-1 --第一台商用计算机系统诞生,设计者是J.Presper Eckert 和John Mauchly 。
被美国人口普查部门用于人口普查,标志着计算机进入了商业应用时代。
年:磁芯存储器被开发出来。
年:IBM 的John Backus 和他的研究小组开始开发FORTRAN(FORmula TRANslation) , 年完成。这是一种适合科学研究使用的计算机高级语言。
年:IBM 开发成功第一台点阵式打印机。
好了现在开始吧:
操作系统是什么呢?说白了就是一套计算机的指令集合,而计算机的指令就是''之类的机器码,说到底,‘’也是数据,就是可以储存在介质之中的东东,比如纸质卡片,磁盘,芯片上。对于问题“第一个操作系统如何编写的呢”,可以归结为:第一个计算机软件如何编写(在这里,请改变对操作系统的神秘感,操作系统也是一个软件,一个特殊的程序),即是计算机的指令如何记录下来,并且被计算机执行。那么答案已经出来了~~,请再次看一下上面的例子,你会有所启发
还有什么问题请问吧~~~
还有一个问题回答:“自带boot”虽然不知道你这是什么意思(boot程序),但是可以肯定告诉你,在硬件生产时,“可以”直接把’boot”生产在芯片上,为什么?如上说,程序就是数据,生产商只要在芯片上设置电路的通断,就可以表示 (注意了,这里只是一个例子)
好吧,现在假设我们有电脑,要开发操作系统,但是知道计算机指令
那么下面的一段程序(示例)我不得不把他写在纸质笔记本上:
mov ax,0
..
...
这段程序人工翻译成机器码,到现在还没有操作系统:
........
好了操作系统在我的纸上写好了,我就请求硬件开发商把我的程序刻录到软盘上,于是开发商就对照.....把数据刻录到软盘上
于是,操作系统开发完毕,只要想办法被CPU执行就可以了
‘伍’ 电脑系统如何做
如何重新安装XP系统(SP1同SP2安装方法相同)
第一步,设置光盘启动:
所谓光盘启动,意思就是计算机在启动的时候首先读光驱,这样的话如果光驱中有具有光启功能的光盘就可以赶在硬盘启动之前读取出来(比如从光盘安装系统的时候)。
设置方法:
1.启动计算机,并按住DEL键不放,直到出现BIOS设置窗口(通常为蓝色背景,**英文字)。
2.选择并进入第二项,“BIOSSETUP”(BIOS设置)。在里面找到包含BOOT文字的项或组,并找到依次排列的“FIRST”“SECEND”“THIRD”三项,分别代表“第一项启动”“第二项启动”和“第三项启动”。这里我们按顺序依次设置为“光驱”“软驱”“硬盘”即可。(如在这一页没有见到这三项E文,通常BOOT右边的选项菜单为“SETUP”,这时按回车进入即可看到了)应该选择“FIRST”敲回车键,在出来的子菜单选择CD-ROM。再按回车键
3.选择好启动方式后,按F键,出现E文对话框,按“Y”键(可省略),并回车,计算机自动重启,证明更改的设置生效了。
第二步,从光盘安装XP系统
在重启之前放入XP安装光盘,在看到屏幕底部出现CD字样的时候,按回车键。才能实现光启,否则计算机开始读取硬盘,也就是跳过光启从硬盘启动了。
XP系统盘光启之后便是蓝色背景的安装界面,这时系统会自动分析计算机信息,不需要任何操作,直到显示器屏幕变黑一下,随后出现蓝色背景的中文界面。
这时首先出现的是XP系统的协议,按F8键(代表同意此协议),之后可以见到硬盘所有分区的信息列表,并且有中文的操作说明。选择C盘,按D键删除分区(之前记得先将C盘的有用文件做好备份),C盘的位置变成“未分区”,再在原C盘位置(即“未分区”位置)按C键创建分区,分区大小不需要调整。之后原C盘位置变成了“新的未使用”字样,按回车键继续。接下来有可能出现格式化分区选项页面,推荐选择“用FAT格式化分区(快)”。按回车键继续。
系统开始格式化C盘,速度很快。格式化之后是分析硬盘和以前的WINDOWS操作系统,速度同样很快,随后是复制文件,大约需要8到分钟不等(根据机器的配置决定)。
复制文件完成(%)后,系统会自动重新启动,这时当再次见到CD-ROM.....的时候,不需要按任何键,让系统从硬盘启动,因为安装文件的一部分已经复制到硬盘里了(注:此时光盘不可以取出)。
出现蓝色背景的彩色XP安装界面,左侧有安装进度条和剩余时间显示,起始值为分钟,也是根据机器的配置决定,通常P4,2.4的机器的安装时间大约是到分钟。
此时直到安装结束,计算机自动重启之前,除了输入序列号和计算机信息(随意填写),以及敲2到3次回车之外,不需要做任何其它操作。系统会自动完成安装。
第三步,驱动的安装
1.重启之后,将光盘取出,让计算机从硬盘启动,进入XP的设置窗口。
2.依次按“下一步”,“跳过”,选择“不注册”,“完成”。
3.进入XP系统桌面。
4.在桌面上单击鼠标右键,选择“属性”,选择“显示”选项卡,点击“自定义桌面”项,勾
选“我的电脑”,选择“确定”退出。
5.返回桌面,右键单击“我的电脑”,选择“属性”,选择“硬件”选项卡,选择“设备管理器”,里面是计算机所有硬件的管理窗口,此中所有前面出现**问号+叹号的选项代表未安装驱动程序的硬件,双击打开其属性,选择“重新安装驱动程序”,放入相应当驱动光盘,选择“自动安装”,系统会自动识别对应当驱动程序并安装完成。(AUDIO为声卡,VGA为显卡,SM为主板,需要首先安装主板驱动,如没有SM项则代表不用安装)。安装好所有驱动之后重新启动计算机。至此驱动程序安装完成。
‘陆’ 如何制作电脑系统
首先要了解一些计算机组成原理,需要学一些编程语言譬如C,和汇编语言
可以自己去看看操作系统的原理。可以去学学有关Linux
另外Linux是开源的,你可以去看看系统源代码。
(这是一个相当庞大的任务,一个人很难完成,很多人一起开发都有难度)
è±è¯ç¿»è¯
ä½ å¥½,以ä¸æ¯æçåç:
(ç®ä½)
å®éªè¿è¡äºå¾å¤
æµè¯ä»ªï¼å¾1 ï¼ ï¼å ¶ä¸çæ©æ¦å£°é³æ产çç
èç»è¯¥åä½çä¸é¢ 毫米ç£çä¸ä¸ªåä½ï¼é å§ï¼
è¿æ¥å°ä¸ä¸ªç§»å¨çé¶æ®µã以åå°èæ¯åªé³
å级ï¼æ±½è½¦æ¯æ¾ç½®å¨ä¸ä¸ªåç¬ç声é³ç»ç¼
é´åç£æ§çèºä¸è¢«ç¨æ¥å¨è®®
é¶æ®µãå é¨è¯éªå®¤ç
å¸å£°ææï¼ä»¥æ¶é¤å£°é³çæèã
æ£å¸¸è´è·æ¯éç¨çå¼¹æ§åå½¢1
é¢æ¿å¼¹ç°§æ¶ï¼ xzé¶æ®µæ¯éä½ä¸æ¥ã声é³
æ¯è¡¡éä¸ä¸ªéº¦å é£ï¼æ¾ç½®å¨çº¦2.5åç±³
ä»ä¸å¿ä¸æ æ¬ææ人ã
æ æ¬å®éªä¸æç¨çåäºè¨ï¼
é¢JISæ å-S USç3 ãè¿è¡è¯éªçææ
ç²ç³åº¦ç»åç两个æ æ¬ï¼å¤§å®æ£®æ
è¿æ¥1 ï¼å¨è´è½½æ åµä¸è®¾ç½®ä¸º0.5å1个Nåæ»å¨é度
毫米/ç§ã
ä¸ä¸ªä¾åï¼åå§æ°æ®æè·å¾ç麦å é£
æµéç»æ表æï¼å¨å¾ã 2 ãå¾é¿æ¶é´ï¼å¹³åæ¯æ ¹
å¹³å广åºï¼åæ¹æ ¹ï¼å¼ä¼°è®¡ï¼ä»åæ
声åä¿¡å·åæ¯è¾ãç´æ¥çRMSå¼
æ¯è¾æ¯é¦éå¨è¿æ¹é¢çç 究ï¼ä»¥æ´COMç
å¨ä¸æ¯è¾åè´æ°´å¹³ï¼å¯¹æ°ç¸å ³
èµ°åRMSå¼ï¼ ï¼å 为åè 代表ç©ç
åèªè¿ç¨ä¸ï¼èåè åæ¯ç¨äºæ¹ä¾¿ã
éè¿æ¯è¾è¯¥é¢è°±æ©æ¦
å¥å ¨å¯¹èæ¯åªé³ï¼ç»æåç°å¨
é¢å¸¦ç±0.5è³5å赫çä¿¡å·æ讯
æ¯ä¾æ¯æé«çãææè¿ä¸æ¥è¿è¡äºåæï¼å¨è¿
é¢æ®µåªã
(ç¹ä½)
å®éªè¿è¡äºå¾å¤
æµè¯ä»ªï¼å¾1 ï¼ ï¼å ¶ä¸çæ©æ¦å£°é³æ产çç
èç»è¯¥åä½çä¸é¢ 毫米ç£çä¸ä¸ªåä½ï¼é å§ï¼
è¿æ¥å°ä¸ä¸ªç§»å¨çé¶æ®µã以åå°èæ¯åªé³
å级ï¼æ±½è½¦æ¯æ¾ç½®å¨ä¸ä¸ªåç¬ç声é³ç»ç¼
é´åç£æ§çèºä¸è¢«ç¨æ¥å¨è®®
é¶æ®µãå é¨è¯éªå®¤ç
å¸å£°ææï¼ä»¥æ¶é¤å£°é³çæèã
æ£å¸¸è´è·æ¯éç¨çå¼¹æ§åå½¢1
é¢æ¿å¼¹ç°§æ¶ï¼ xzé¶æ®µæ¯éä½ä¸æ¥ã声é³
æ¯è¡¡éä¸ä¸ªéº¦å é£ï¼æ¾ç½®å¨çº¦2.5åç±³
ä»ä¸å¿ä¸æ æ¬ææ人ã
æ æ¬å®éªä¸æç¨çåäºè¨ï¼
é¢JISæ å-S USç3 ãè¿è¡è¯éªçææ
ç²ç³åº¦ç»åç两个æ æ¬ï¼å¤§å®æ£®æ
è¿æ¥1 ï¼å¨è´è½½æ åµä¸è®¾ç½®ä¸º0.5å1个Nåæ»å¨é度
毫米/ç§ã
ä¸ä¸ªä¾åï¼åå§æ°æ®æè·å¾ç麦å é£
æµéç»æ表æï¼å¨å¾ã 2 ãå¾é¿æ¶é´ï¼å¹³åæ¯æ ¹
å¹³å广åºï¼åæ¹æ ¹ï¼å¼ä¼°è®¡ï¼ä»åæ
声åä¿¡å·åæ¯è¾ãç´æ¥çRMSå¼
æ¯è¾æ¯é¦éå¨è¿æ¹é¢çç 究ï¼ä»¥æ´COMç
å¨ä¸æ¯è¾åè´æ°´å¹³ï¼å¯¹æ°ç¸å ³
èµ°åRMSå¼ï¼ ï¼å 为åè 代表ç©ç
åèªè¿ç¨ä¸ï¼èåè åæ¯ç¨æ¼æ¹ä¾¿ã
éè¿æ¯è¾è¯¥é¢è°±æ©æ¦
å¥å ¨å¯¹èæ¯åªé³ï¼ç»æåç°å¨
é¢å¸¦ç±0.5è³5å赫çä¿¡å·æ讯
æ¯ä¾æ¯æé«çãææè¿ä¸æ¥è¿è¡äºåæï¼å¨è¿
é¢æ®µåªã
ATIHD显卡怎么样
ATI HD显卡是不错的。
它足以在高画质下胜任几乎所有的DX游戏,除了孤岛危机和GTA4,另外它也可以支持高清音频源码输出。ATI HD是笔记本显卡,HD代表AMD HD领域中高端的产品,采用了先进的纳米工艺,核心或显存频率为兆赫兹或兆赫兹,一大优势是对DX和DirectComputer 5、0的支持,同比NVIDIA的GT 兆,在视频渲染方面表现优异。